我有一个主键为varchar(255)的表。在某些情况下,255个字符是不够的。我尝试将字段更改为文本,但我得到以下错误:

BLOB/TEXT column 'message_id' used in key specification without a key length

我该如何解决这个问题?

编辑:我还应该指出,这个表有一个多列的复合主键。


当前回答

我知道现在已经很晚了,但是删除唯一键约束解决了这个问题。我没有使用TEXT或LONGTEXT列作为PK,但我试图使它独特。我得到了1170的错误,但当我删除了英国,错误也被删除了。

我不完全明白为什么。

其他回答

像这样使用

@Id
@Column(name = "userEmailId", length=100)
private String userEmailId;

您应该定义要索引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哈希并将其用作主键。

去mysql编辑表->更改列类型为varchar(45)。

该问题的解决方案是,在CREATE TABLE语句中,您可以在列创建定义之后添加约束UNIQUE (problemtextfield(300)),例如,为TEXT字段指定300个字符的键长度。然后,问题文本字段的前300个字符需要是唯一的,之后的任何差异将被忽略。

我曾经用过这个,也犯过你提到的错误:

CREATE INDEX idx_col1 ON my_table (col1);

然后我把它换成了这个,并解决了:

CREATE INDEX idx_col1 ON my_table (col1(255));