Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:如何将varchar(255)UNIQUE列更改为UNIQUE Text NOT NULL?_Mysql_Sql_Mysql Error 1170 - Fatal编程技术网

MySQL:如何将varchar(255)UNIQUE列更改为UNIQUE Text NOT NULL?

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

当前列是VARCHAR(255)NOTNULL,因此如何将其更改为TEXT NOTNULL

注意:要更改其属性类型的列是另一列的唯一键组合。例如

唯一密钥(名称、描述)

列描述当前在varchar(255)中。无法更改它,因为:

错误1170(42000):在没有密钥长度的密钥规范中使用BLOB/TEXT列“description”

我需要它是文本,否则我需要重新创建整个东西??我已经得到了一些乏味而重要的数据。重新创建会很麻烦

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 ;