Jika suatu saat ada bug sehingga tabel yang kita gunakan menginsert data duplikat berdasarkan kolom data tertentu.
Semisal kita memiliki tabel users seperti berikut:
| id | name | |
|---|---|---|
| 1 | Alice | alice@email.com |
| 2 | Bob | bob@email.com |
| 3 | Alice | alice@email.com |
| 4 | Charlie | charlie@email.com |
A. Hapus Duplicate Berdasarkan Kolom (contoh kolom email)
DELETE u1 FROM users u1
JOIN users u2
ON u1.email = u2.email
AND u1.id > u2.id;
u1.id > u2.id memastikan hanya baris duplikat dengan ID lebih besar yang dihapus, artinya satu data yang pertama kali diinput yang dipertahankan. — pada contoh tabel diatas, id = 1 akan dipertahankan, id = 3 akan dihapus
Atau ubah menjadi u1.id < u2.id jika ingin mempertahankan ID yang paling besar, artinya data yang terakhir diinput yang dipertahankan. — pada contoh tabel diatas, id = 3 akan dipertahankan, id = 1 akan dihapus
B. Menggunakan ROW_NUMBER() (MariaDB 10.2+)
WITH cte AS (
SELECT id, email,
ROW_NUMBER() OVER (PARTITION BY email ORDER BY id) AS row_num
FROM users
)
DELETE FROM users
WHERE id IN (
SELECT id FROM cte WHERE row_num > 1
);
Ini lebih fleksibel dan mudah dibaca, tapi hanya bisa digunakan di MariaDB 10.2 ke atas (atau MySQL 8+).
Selalu backup tabel atau coba SELECT dulu untuk melihat mana yang akan dihapus
SELECT * FROM users u1
JOIN users u2 ON u1.email = u2.email AND u1.id > u2.id;