如果表中有重复项,则使用
ALTER TABLE mytable ADD UNIQUE INDEX myindex (A, B, C, D);
该查询将失败,并显示错误1062(重复键)。
但是如果你用
IGNORE
-- (only works before MySQL 5.7.4)ALTER IGNORE TABLE mytable ADD UNIQUE INDEX myindex (A, B, C, D);
重复项将被删除。但是文档没有指定要保留的行:
IGNORE是标准SQL的MySQL扩展。它控制ALTERTABLE新表中唯一键上是否有重复项或启用严格模式时是否出现警告的工作方式。如果IGNORE未指定,则复制副本将中止并在发生重复键错误时回滚。如果IGNORE指定,则仅一行使用唯一键重复的行。其他冲突的行将被删除。不正确的值将被截断为最接近的匹配可接受值。从MySQL 5.7.4开始,ALTER TABLE的IGNORE子句被删除,使用它会产生错误。
(ALTER TABLE语法)
如果您的版本是5.7.4或更高版本-您可以:
- 将数据复制到临时表中(从技术上讲,它不需要是临时表)。
- 截断原始表。
- 创建唯一索引。
并将数据复制回
INSERT IGNORE
(仍然可用)。CREATE TABLE tmp_data SELECt * FROM mytable;
TRUNCATE TABLE mytable;
ALTER TABLE mytable ADD UNIQUE INDEX myindex (A, B, C, D);
INSERT IGNORE INTO mytable SELECt * from tmp_data;
DROP TABLE tmp_data;
如果使用
IGNORE修饰符,则执行INSERT语句时发生的错误将
被忽略。例如,如果不IGNORE使用,则复制表中现有UNIQUE索引或PRIMARY KEY值的行将导致重复键错误,并且该语句将中止。使用IGNORE,该行将被丢弃,并且不会发生错误。被忽略的错误会生成警告。
(插入语法)
另请参见:INSERT … SELECT语法以及IGNORE关键字和严格SQL模式的比较
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)