Sử dụng DELETE với self-join để xóa các bản ghi trùng lặp, giữ lại bản ghi có ID nhỏ nhất (hoặc lớn nhất).
Ví dụ
Tạo bảng StudentName có trùng 'Carol' 3 lần:
mysql> create table DemoTable (
StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentName varchar(40)
);
Query OK, 0 rows affected (0.48 sec)Dữ liệu: John(1), Carol(2), Sam(3), Carol(4), David(5), Carol(6)
Xóa trùng lặp giữ ID nhỏ nhất
mysql> delete tbl1 from DemoTable tbl1,DemoTable tbl2
WHERE tbl1.StudentName = tbl2.StudentName
AND tbl1.StudentId > tbl2.StudentId;
Query OK, 2 rows affected (0.79 sec)Kết quả (giữ Carol ID=2, xóa ID=4,6):
+-----------+-------------+ | StudentId | StudentName | +-----------+-------------+ | 1 | John | | 2 | Carol | | 3 | Sam | | 5 | David | +-----------+-------------+
Giải thích: Self-join bảng với chính nó. Điều kiện tbl1.StudentId > tbl2.StudentId đảm bảo chỉ xóa bản ghi có ID lớn hơn (giữ ID nhỏ nhất).
Cách khác (MySQL 8.0+): Dùng ROW_NUMBER() OVER (PARTITION BY StudentName ORDER BY StudentId) rồi xóa где rn > 1.