我有一个看起来像这样的表:
CREATE TABLE t1 (
id BIGINT AUTO_INCREMENT NOT NULL PRIMARY KEY,
col1 VARCHAR(256),
UNIQUE INDEX t1_col1_index (col1)
)
我正在尝试使用以下查询修改col1类型:
ALTER TABLE t1 MODIFY COLUMN col1 varchar(191) COLLATE utf8mb4_unicode_ci;
但是,我遇到了此重复错误:
错误:(“ 1062”,“ QMYSQL3:无法执行语句”,“键't1_col1_index'的重复条目'+123456789'”)
最初,我认为这可能是因为两行或更多行可能针对col1“包含”相似的值,并且在更改varchar长度时,数据被截断了,但是后来我发现数据截断甚至不允许查询通过。任何可能导致这种情况的指针?
编辑(已解决):当未使用STRICT_TRANS_TABLES设置@@ sql_mode时,会发生截断。这是导致错误的原因。
答案 0 :(得分:1)
您正在减少由UNIQUE
约束控制的varchar列的长度。
这是有风险的业务。超大数据将被自动修剪(除非您将@@sql_mode
设置为STRICT_TRANS_TABLES
,在这种情况下将引发错误)。这可能会生成重复项,从而导致您的UNIQUE
约束引发错误。
您可以使用以下命令检查列中值的最大长度:
SELECT MAX(CHAR_LENGTH(col1)) FROM t1:
答案 1 :(得分:0)
我不确定这是否行得通。
尝试检查表t1
。
select count(1) from t1 where col1 = 123456789
现在,如果count大于一个,则尝试删除另一个,并仅保留一个记录。
然后尝试再次运行您的语句。
提醒:
删除之前,请先执行back up
。