我在两个表之间插入了字段A、B、C、D,认为我已经创建了一个唯一索引来防止重复。但是我不知怎么的只是简单地创建了一个普通索引。所以会有重复记录被插入。这是一个2000万条记录的表。
如果我将现有的索引从普通索引更改为唯一索引或者简单地添加一个针对A、B、C、D的新唯一索引,那么重复记录将被删除吗?还是添加失败,因为唯一记录已经存在了?我想测试一下,但是它有3000万条记录,我既不希望弄乱表格,也不希望重复它。
我在两个表之间插入了字段A、B、C、D,认为我已经创建了一个唯一索引来防止重复。但是我不知怎么的只是简单地创建了一个普通索引。所以会有重复记录被插入。这是一个2000万条记录的表。
如果我将现有的索引从普通索引更改为唯一索引或者简单地添加一个针对A、B、C、D的新唯一索引,那么重复记录将被删除吗?还是添加失败,因为唯一记录已经存在了?我想测试一下,但是它有3000万条记录,我既不希望弄乱表格,也不希望重复它。
ALTER TABLE mytable ADD UNIQUE INDEX myindex (A, B, C, D);
IGNORE
,则会忽略该错误。-- (only works before MySQL 5.7.4)
ALTER IGNORE TABLE mytable ADD UNIQUE INDEX myindex (A, B, C, D);
重复行将被删除。但是文档没有指定哪一行会被保留:
IGNORE
是 MySQL 对标准 SQL 的扩展。如果新表中存在唯一键上的重复项,或启用了严格模式时发生警告,则它控制ALTER TABLE
的工作方式。如果未指定IGNORE
,则如果出现重复键错误,则复制将中止并回滚。如果指定了IGNORE
,则仅使用一个唯一键上有重复的行。其他冲突行将被删除。不正确的值将被截断为最接近的可接受值。
从 MySQL 5.7.4 开始,ALTER TABLE 的 IGNORE 子句已被删除,并且其使用会产生错误。
如果您的版本是 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 Syntax和Comparison of the IGNORE Keyword and Strict SQL Mode
IGNORE
,它仍然会抛出一个“无法写入;表中有重复键”的错误。 - RVP如果您认为会有重复数据,添加唯一索引将失败。先检查哪些数据是重复的:
select * from
(select a,b,c,d,count(*) as n from table_name group by a,b,c,d) x
where x.n > 1
where a='some_value'
,则可以将其拆分成更小的块。
对于检索到的记录,您必须更改某些内容以使行唯一。如果已完成此操作(查询返回0行),则应安全地添加主索引。你可以使用ON DUPLICATE KEY UPDATE代替IGNORE,这样你就可以控制哪些值应该优先。
UNIQUE
约束将会抛出一个错误。CREATE TABLE `USER` (
`USER_ID` INT NOT NULL,
`USERNAME` VARCHAR(45) NOT NULL,
`NAME` VARCHAR(45) NULL,
PRIMARY KEY (`USER_ID`));
INSERT INTO USER VALUES(1,'apple', 'woz'),(2,'apple', 'jobs'),
(3,'google', 'sergey'),(4,'google', 'larry');
ALTER TABLE `USER`
ADD UNIQUE INDEX `USERNAME_UNIQUE` (`USERNAME` ASC);
/*
Operation failed: There was an error while applying the SQL script to the database.
ERROR 1062: Duplicate entry 'apple' for key 'USERNAME_UNIQUE'
*/
IGNORE
关键字 - 否则它会失败。在一个小的测试表上进行测试。 - Paul Spiegel