Ако имате дубликати в таблицата си и използвате
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);
дубликатите ще бъдат премахнати. Но документацията не посочва кой ред ще бъде запазен:
Ако вашата версия е 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;
Вижте също:INSERT ... SELECT Синтаксис и Сравнение на ключовата дума IGNORE и Строг SQL режим