在使用JPA 时,定义@Entity对象时,有些字段需要唯一(如账号名),但是我发现,自动生成的数据库中,对该字段并没有设置为唯一约束
对象如下
@Entity
@EntityListeners(AuditingEntityListener.class)
@Data
public class AdminUser {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true, nullable = false)
// @NotEmpty
// @Length(min = 4, max = 20)
// @ApiModelProperty("账户名(4-20)")
private String acctName;
@Column
// 转成32位 md5密码
private String password;
}
查看 console 输出,确实有修改命名
Hibernate:
create table admin_user (
...
) engine=InnoDB
Hibernate:
alter table admin_user
drop index UK_5gnafmd0cjdf2txrbtigl1fsa
Hibernate:
alter table admin_user
add constraint UK_5gnafmd0cjdf2txrbtigl1fsa unique (acct_name)
反复测试后,发现,Long对象的 unique 可以添加成功,String 对象的不行,然后我把 String 对象加上length限制
@Column(unique = true, nullable = false, length = 20)
private String acctName;
结果就成功了。
原因
然后查找原因,手动创建表,添加索引,出现如下错误
Specified key was too long; max key length is 767 bytes
原来是因为指定字段长度过长。未指定长度的字符串,默认为255 varchar,utf8mb4字符集每个 varchar 为4bytes,即为总长255x4=1020bytes,大于了767bytes。
因此,unique 字段的最大长度为767/4 = 191 varchar。(注:utf8mb4字符集)