Tôi thấy hữu ích khi thêm chỉ mục unqiue bằng cách sử dụng "ALTER IGNORE" để loại bỏ các bản sao và thực thi các bản ghi duy nhất mà bạn muốn làm. Vì vậy, cú pháp sẽ là:
ALTER IGNORE TABLE `table` ADD UNIQUE INDEX(`id`, `another_id`, `one_more_id`);
Điều này có hiệu quả bổ sung ràng buộc duy nhất có nghĩa là bạn sẽ không bao giờ có các bản ghi trùng lặp và việc BỎ QUA sẽ xóa các bản sao hiện có.
Bạn có thể đọc thêm về eh ALTER IGNORE tại đây: http://mediakey.dk/~cc/mysql-remove-duplicate-entries/
Cập nhật: Tôi đã được @Inquisitive thông báo rằng điều này có thể không thành công trong các phiên bản MySql> 5.5:
Nó không thành công trên MySQL> 5.5 và trên bảng InnoDB và trong Percona vì tính năng tạo chỉ mục nhanh InnoDB của họ [ http://bugs.mysql.com/bug.php?id=40344] . Trong trường hợp này trước tiên hãy chạy set session old_alter_table=1
và sau đó lệnh trên sẽ hoạt động tốt
Cập nhật - ALTER IGNORE
Loại bỏ trong 5.7
Từ các tài liệu
Kể từ MySQL 5.6.17, mệnh đề BỎ QUA không được dùng nữa và việc sử dụng nó tạo ra cảnh báo. IGNORE bị loại bỏ trong MySQL 5.7.
Một trong những nhà phát triển MySQL đưa ra hai lựa chọn thay thế :
- Nhóm theo các trường duy nhất và xóa như đã thấy ở trên
- Tạo một bảng mới, thêm một chỉ mục duy nhất, sử dụng
INSERT IGNORE
, ví dụ:
CREATE TABLE duplicate_row_table LIKE regular_row_table;
ALTER TABLE duplicate_row_table ADD UNIQUE INDEX (id, another_id);
INSERT IGNORE INTO duplicate_row_table SELECT * FROM regular_row_table;
DROP TABLE regular_row_table;
RENAME TABLE duplicate_row_table TO regular_row_table;
Nhưng tùy thuộc vào kích thước bàn của bạn, điều này có thể không thực tế