一、问题:
通过注解@Table(name = "monitor_edge_daily", uniqueConstraints = {@UniqueConstraint(columnNames={"station_id","report_date"})})无法在数据库创建索引。
代码如下:
package test.domain;
import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
@Entity
@Table(name = "monitor_edge_daily",
uniqueConstraints = {@UniqueConstraint(columnNames={"station_id","report_date"})})
public class EdgeDaily implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "station_id", nullable = false)
private String stationId;
@Temporal(TemporalType.DATE)
@Column(name = "report_date", nullable = false)
private Date reportDate;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getStationId() {
return stationId;
}
public void setStationId(String stationId) {
this.stationId = stationId;
}
public Date getReportDate() {
return reportDate;
}
public void setReportDate(Date reportDate) {
this.reportDate = reportDate;
}
}
二、知识点:
1.String类型字段 映射到 数据库 的默认长度是255个字符
@Column(name = "station_id", nullable = false)
private String stationId;
2.MySQL数据库不同的搜索引擎,索引的长度限制不同。
innoDB引擎下:
(1)单列索引的长度不能超过767个字节
(2)联合索引的长度之和不能超过3072个字节
myisam引擎:
单列索引长度、联合索引长度之和都不能超过1000个字节
3.MySQL的utf8字符集 一个字符占用3个字节;
utf8mb4字符集 一个字符占用4个字节
三、问题分析
(1)代码中String类型字段默认长度为255个字符,
(2)数据库使用的引擎为innoDB,字符集为utf8mb4。
这样的话,单列索引长度为 255*4 = 1020 > 767,所以创建索引失败。
四、解决方案
代码中显示设置字段长度,不大于191个字符:
@Column(name = "station_id", nullable = false, length = 191)
private String stationId;