更改表修改列期间发生mysql错误1062

时间:2019-01-03 00:34:58

标签: mysql qt qsqlquery

我有一个看起来像这样的表:

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时,会发生截断。这是导致错误的原因。

2 个答案:

答案 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