Cara mudah hapus data duplikat pada Tabel MySQL
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;