我有一个主键为varchar(255)的表。在某些情况下,255个字符是不够的。我尝试将字段更改为文本,但我得到以下错误:
BLOB/TEXT column 'message_id' used in key specification without a key length
我该如何解决这个问题?
编辑:我还应该指出,这个表有一个多列的复合主键。
我有一个主键为varchar(255)的表。在某些情况下,255个字符是不够的。我尝试将字段更改为文本,但我得到以下错误:
BLOB/TEXT column 'message_id' used in key specification without a key length
我该如何解决这个问题?
编辑:我还应该指出,这个表有一个多列的复合主键。
当前回答
像这样使用
@Id
@Column(name = "userEmailId", length=100)
private String userEmailId;
其他回答
我得到这个错误时,添加一个索引的文本类型列表。您需要声明每个文本类型要使用的大小。
将大小放入括号()内
如果使用了太多字节,您可以在方括号中为varchar声明一个大小,以减少用于索引的数量。即使你已经为varchar(1000)这样的类型声明了一个大小。您不需要像其他人所说的那样创建一个新表。
添加索引
alter table test add index index_name(col1(255),col2(255));
添加唯一索引
alter table test add unique index_name(col1(255),col2(255));
您应该定义要索引TEXT列的哪个前导部分。
InnoDB对每个索引键有768字节的限制,你不能创建一个超过这个长度的索引。
这将很好地工作:
CREATE TABLE t_length (
mydata TEXT NOT NULL,
KEY ix_length_mydata (mydata(255)))
ENGINE=InnoDB;
注意,键大小的最大值取决于列字符集。像LATIN1这样的单字节字符集有767个字符,而UTF8只有255个字符(MySQL只使用BMP,每个字符最多需要3个字节)
如果您需要整个列都是主键,计算SHA1或MD5哈希并将其用作主键。
另一种很好的处理方法是创建没有唯一约束的TEXT字段,并添加一个兄弟VARCHAR字段,该字段是唯一的,并且包含TEXT字段的摘要(MD5、SHA1等)。当您插入或更新TEXT字段时,计算并存储整个TEXT字段的摘要,这样您就可以对整个TEXT字段(而不是一些前面的部分)有一个可以快速搜索的唯一性约束。
alter table authors ADD UNIQUE(name_first(767), name_second(767));
注意:767是MySQL在处理blob/text索引时索引列的字符数限制
参考:http://dev.mysql.com/doc/refman/5.7/en/innodb-restrictions.html
像这样使用
@Id
@Column(name = "userEmailId", length=100)
private String userEmailId;