首页 > 解决方案 > 通过 JDBC 语句执行 DDL“更改表学生添加约束 UK_fe0i52si7ybu0wjedj6motiim 唯一(电子邮件)”时出错

问题描述

我正在尝试使用 MySQL 数据库启动 Spring Boot/Spring Data JPA 项目。但是在email字段上设置唯一约束存在问题。
我的代码:


import javax.persistence.*;
import static  javax.persistence.GenerationType.SEQUENCE;

@Entity(name = "Student")
@Table(name = "student")
public class Student {

    @Id
    @SequenceGenerator(name = "student_sequence", sequenceName = "student_sequence", allocationSize = 1)
    @GeneratedValue(strategy = SEQUENCE, generator = "student_sequence")
    @Column(name = "id", updatable = false)
    private Long id;

    @Column(name = "first_name", nullable = false, columnDefinition = "TEXT")
    private String firstName;

    @Column(name = "last_name", nullable = false, columnDefinition = "TEXT")
    private String lastName;

    @Column(name = "email", nullable = false, columnDefinition = "TEXT", unique = true)
    private String email;

    @Column(name = "age")
    private Integer age;

    public Student(Long id, String firstName, String lastName, String email, Integer age) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
        this.age = age;
     }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", email='" + email + '\'' +
                ", age=" + age +
                '}';
    }
}

应用程序属性:

spring.datasource.url=jdbc:mysql://localhost/mydatabase
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
spring.jpa.properties.hibernate.format_sql=true

我尝试更改spring.jpa.hibernate.ddl-auto=create-dropspring.jpa.hibernate.ddl-auto=update,并且在这一切都完美之后,但我不需要update,我需要create-drop
另外,我尝试更改spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8DialectMySQL5DialectMySQL55Dialect。但没有任何改变。

标签: javamysqlspringspring-bootjpa

解决方案


我有同样的问题

对我有用的是从@Column中删除columnDefinition="TEXT"

你应该有这个:@Column(name = "email", nullable = false, unique = true)

或者

您可以从@Column中删除unique=true并使用 SQL 手动添加它

alter table student add constraint ~constraint_name~ unique(email(~length~)

例子:

alter table student add constraint student_unique_email unique(email(50))

祝你在 amigosCode 课程上好运。


推荐阅读