【问题标题】:MySQL: How to alter varchar(255) UNIQUE column to UNIQUE Text NOT NULL?MySQL:如何将 varchar(255) UNIQUE 列更改为 UNIQUE Text NOT NULL?
【发布时间】:2011-06-12 06:59:15
【问题描述】:

当前列是 VARCHAR(255) NOT NULL,那么如何将其更改为 TEXT NOT NULL?

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

唯一键(名称、描述)

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

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

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

【问题讨论】:

  • 可以通过谷歌搜索轻松获得答案
  • 请重新阅读问题。对不起..

标签: mysql sql mysql-error-1170


【解决方案1】:

您打算使用 TEXT 列作为 UNIQUE KEY 的一部分吗? 这是非常低效的!不要那样做! 我强烈建议您:

  • 添加附加列,例如'description_hash' char(32) not null default ''
  • description 字段的哈希值存储到其中。例如。 description_hash=MD5(description)
  • 将您的密钥更改为UNIQUE KEY (name, description_hash)

当然,您需要在您的代码中保持description_hash 列是最新的,但是如您所见 - 在大多数情况下,它只需要很少的代码更改。 或者您可以使用触发器来处理此问题。

【讨论】:

  • 嗨,是的,我试图让 text 成为唯一键,现在我保持 varchar 是唯一的。我创建了另一个名为 More_About 的字段。不确定这是否是最好的方法,但我读到没有办法将文本用作唯一。此外,我什至找不到改变唯一键列属性的方法。例子很模糊。稍后我会在这里重新查看答案,谢谢。
  • 您不需要使用全文作为唯一索引 - 仅使用此文本中的哈希(md5、sha1、fnv 等)作为唯一索引,如上所述。
【解决方案2】:

我遇到了完全相同的问题。

我添加了一个新的 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 ;

通过使用触发器并在哈希上添加唯一索引,您可以确保哈希值始终是最新且唯一的。

【讨论】:

    【解决方案3】:
    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));
    

    your_length = 最多允许 1000 个字节

    最大密钥长度为 1000 字节。这也可以通过更改源并重新编译来更改。对于超过 250 字节的密钥,使用比默认的 1024 字节更大的密钥块大小


    都是长度(描述+另一列不能超过1000),所以

    alter table your_table 
    add unique index your_index_name (description(800), another_column(200));
    

    【讨论】:

    • 嘿,对不起,我在我的问题中更新了这个。问题应该是该列也是唯一键。
    • 我不明白,如果我告诉你列的名称是“描述”,你能不能写出来。它是另一个名为“name”的列的组合,它们都形成了一个 UNIQUE KEY。如何在 MySQL 查询中编写它?我只需要将描述属性更改为 TEXT NOT NULL。谢谢..
    • alter table table_name 添加唯一索引描述(description(1000)); // 嗨,你能澄清一下吗?它不工作。此外,您的代码没有指定更改哪一列??
    猜你喜欢
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 2018-06-03
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    相关资源
    最近更新 更多