Berikut adalah contoh penghapusan baris duplikat dari tabel di MariaDB ketika baris tersebut memiliki kunci utama atau kolom pengenal unik.
Contoh menghapus baris duplikat tetapi menyimpannya. Jadi dalam kasus dua baris yang identik, itu menghapus salah satunya dan menyimpan yang lain.
Contoh Data
Contoh kami menggunakan data berikut:
SELECT * FROM Dogs;
Hasil:
+-------+-----------+----------+ | DogId | FirstName | LastName | +-------+-----------+----------+ | 1 | Bark | Smith | | 2 | Bark | Smith | | 3 | Woof | Jones | | 4 | Ruff | Robinson | | 5 | Wag | Johnson | | 6 | Wag | Johnson | | 7 | Wag | Johnson | +-------+-----------+----------+
Kita dapat melihat bahwa dua baris pertama adalah duplikat, begitu juga dengan tiga baris terakhir.
DogId
kolom memegang nilai unik (karena itu adalah kunci utama tabel), dan oleh karena itu, secara tegas, tidak ada duplikat. Tetapi dalam situasi kehidupan nyata, Anda akan sering ingin menghapus tabel yang berisi kunci utama. Oleh karena itu, dalam artikel ini kami mengabaikan kunci utama, dan kami mendeteksi nilai duplikat di kolom yang tersisa.
Opsi 1
Mari kita mulai opsi pertama kita dengan memilih semua baris yang akan dihapus:
SELECT * FROM Dogs
WHERE DogId IN (
SELECT DogId FROM Dogs
EXCEPT SELECT MIN(DogId) FROM Dogs
GROUP BY FirstName, LastName
);
Hasil:
+-------+-----------+----------+ | DogId | FirstName | LastName | +-------+-----------+----------+ | 2 | Bark | Smith | | 6 | Wag | Johnson | | 7 | Wag | Johnson | +-------+-----------+----------+
Untuk menghapus baris duplikat tersebut, kita dapat mengganti SELECT *
untuk DELETE
:
DELETE FROM Dogs
WHERE DogId IN (
SELECT DogId FROM Dogs
EXCEPT SELECT MIN(DogId) FROM Dogs
GROUP BY FirstName, LastName
);
Hasil:
Query OK, 3 rows affected (0.017 sec)
Dan untuk memverifikasi hasilnya, kita dapat memilih semua baris yang tersisa di tabel:
SELECT * FROM Dogs;
Hasil:
+-------+-----------+----------+ | DogId | FirstName | LastName | +-------+-----------+----------+ | 1 | Bark | Smith | | 3 | Woof | Jones | | 4 | Ruff | Robinson | | 5 | Wag | Johnson | +-------+-----------+----------+
Sebagai alternatif, kita dapat menggunakan MAX()
fungsi alih-alih MIN()
berfungsi untuk mengubah baris mana yang dihapus.
Opsi 2
Dalam contoh ini kita akan menganggap bahwa tabel telah dikembalikan ke keadaan semula (dengan duplikat).
Kita dapat menggunakan kueri berikut untuk memeriksa baris duplikat:
SELECT *
FROM Dogs d1, Dogs d2
WHERE d1.FirstName = d2.FirstName
AND d1.LastName = d2.LastName
AND d1.DogId <> d2.DogId
AND d1.DogId = (
SELECT MAX(DogId)
FROM Dogs d3
WHERE d3.FirstName = d1.FirstName
AND d3.LastName = d1.LastName
);
Hasil:
+-------+-----------+----------+-------+-----------+----------+ | DogId | FirstName | LastName | DogId | FirstName | LastName | +-------+-----------+----------+-------+-----------+----------+ | 2 | Bark | Smith | 1 | Bark | Smith | | 7 | Wag | Johnson | 5 | Wag | Johnson | | 7 | Wag | Johnson | 6 | Wag | Johnson | +-------+-----------+----------+-------+-----------+----------+
Dan kita dapat memodifikasi kueri itu untuk menghapus duplikatnya:
DELETE FROM Dogs WHERE DogId IN (
SELECT d2.DogId
FROM Dogs d1, Dogs d2
WHERE d1.FirstName = d2.FirstName
AND d1.LastName = d2.LastName
AND d1.DogId <> d2.DogId
AND d1.DogId=(
SELECT MIN(DogId)
FROM Dogs d3
WHERE d3.FirstName = d1.FirstName
AND d3.LastName = d1.LastName
)
);
Hasil:
Query OK, 3 rows affected (0.075 sec)
Tabel sekarang telah ditipu.
Kami dapat memverifikasi ini dengan memilih semua baris lagi:
SELECT * FROM Dogs;
Hasil:
+-------+-----------+----------+ | DogId | FirstName | LastName | +-------+-----------+----------+ | 1 | Bark | Smith | | 3 | Woof | Jones | | 4 | Ruff | Robinson | | 5 | Wag | Johnson | +-------+-----------+----------+
Kita bisa menggunakan MAX()
bukannya MIN()
untuk menghapus baris lain dari duplikat jika diinginkan.