MySQL:如何将varchar(255)UNIQUE列更改为UNIQUE Text NOT NULL?
当前列是VARCHAR(255)NOTNULL,因此如何将其更改为TEXT NOTNULL 注意:要更改其属性类型的列是另一列的唯一键组合。例如 唯一密钥(名称、描述) 列描述当前在varchar(255)中。无法更改它,因为: 错误1170(42000):在没有密钥长度的密钥规范中使用BLOB/TEXT列“description” 我需要它是文本,否则我需要重新创建整个东西??我已经得到了一些乏味而重要的数据。重新创建会很麻烦MySQL:如何将varchar(255)UNIQUE列更改为UNIQUE Text NOT NULL?,mysql,sql,mysql-error-1170,Mysql,Sql,Mysql Error 1170,当前列是VARCHAR(255)NOTNULL,因此如何将其更改为TEXT NOTNULL 注意:要更改其属性类型的列是另一列的唯一键组合。例如 唯一密钥(名称、描述) 列描述当前在varchar(255)中。无法更改它,因为: 错误1170(42000):在没有密钥长度的密钥规范中使用BLOB/TEXT列“description” 我需要它是文本,否则我需要重新创建整个东西??我已经得到了一些乏味而重要的数据。重新创建会很麻烦 alter table your_table modify col
alter table your_table
modify column your_column text not null;
对于唯一密钥
alter table your_table
add unique index your_index_name (your_column(your_length));
您的_长度
=最多允许1000字节
最大密钥长度为1000字节。这也可以通过更改源代码和重新编译来更改。对于长度超过250字节的密钥,使用比默认值1024字节更大的密钥块大小
两者的长度(说明+另一列不能超过1000),因此
是否要将文本列用作唯一键的一部分? 效率很低!不要那样做! 我强烈建议您:
- 添加名为的附加列,例如
“description\u hash”char(32)not null default“”
- 将
字段的哈希值存储到其中。例如description
description\u hash=MD5(description)
- 将密钥更改为
唯一密钥(名称、描述\u散列)
description\u hash
列的最新状态,但正如您所看到的,在大多数情况下,它只需要很少的代码更改。
或者你可以使用触发器来处理这个问题。我也遇到了同样的问题 我添加了一个新的char(32)列(我称之为
hash
,并在其上添加了一个唯一的索引)和两个触发器
delimiter |
CREATE TRIGGER insert_set_hash
BEFORE INSERT ON my_table_name
FOR EACH ROW BEGIN
SET NEW.hash = MD5(NEW.my_text);
END; |
CREATE TRIGGER update_set_hash
BEFORE UPDATE ON my_table_name
FOR EACH ROW BEGIN
SET NEW.hash = MD5(NEW.my_text);
END; |
delimiter ;
通过使用触发器并在散列上添加唯一索引,您可以确保散列值始终是最新的和唯一的。可以通过谷歌轻松获得答案。请重新阅读问题。抱歉..嘿,抱歉,我在问题中更新了这个。问题应该是列也是唯一的键。我不明白,如果我告诉你列的名称是“description”,你能写出来吗。它是另一个名为“name”的列的组合,这两个列构成一个唯一键。如何在MySQL查询中编写?我只需要将description属性更改为TEXT NOT NULL。谢谢..更改表名添加唯一索引说明(说明(1000));//嗨,你能澄清一下吗?它不起作用了。此外,您的代码没有指定更改哪一列??嗨,是的,我试图使文本成为唯一键,现在我保持varchar为唯一键。我创建了另一个名为More_About的字段。不确定这是否是最好的方式,但我读到没有办法使用文本作为唯一的。此外,我甚至还找不到改变唯一键列属性的方法。这些例子很模糊。稍后我会在这里重新查看答案,谢谢。您不需要使用全文作为唯一索引-只需使用本文中的散列(md5、sha1、fnv等)作为唯一索引,如我上面所述。
delimiter |
CREATE TRIGGER insert_set_hash
BEFORE INSERT ON my_table_name
FOR EACH ROW BEGIN
SET NEW.hash = MD5(NEW.my_text);
END; |
CREATE TRIGGER update_set_hash
BEFORE UPDATE ON my_table_name
FOR EACH ROW BEGIN
SET NEW.hash = MD5(NEW.my_text);
END; |
delimiter ;