MySQL - Menangani Duplikat
Umumnya, tabel atau kumpulan hasil terkadang berisi rekaman duplikat. Sebagian besar waktu diperbolehkan tetapi terkadang diperlukan untuk menghentikan rekaman duplikat. Diperlukan untuk mengidentifikasi rekaman duplikat dan menghapusnya dari tabel. Bab ini akan menjelaskan cara mencegah terjadinya rekaman duplikat dalam tabel dan cara menghapus rekaman duplikat yang sudah ada.
Mencegah Duplikat Terjadi dalam Tabel
Anda dapat menggunakan file PRIMARY KEY atau a UNIQUE Indeks pada tabel dengan bidang yang sesuai untuk menghentikan rekaman duplikat.
Mari kita ambil contoh - Tabel berikut tidak berisi indeks atau kunci utama seperti itu, sehingga memungkinkan rekaman duplikat untuk first_name dan last_name.
CREATE TABLE person_tbl (
first_name CHAR(20),
last_name CHAR(20),
sex CHAR(10)
);
Untuk mencegah beberapa rekaman dengan nilai nama depan dan belakang yang sama dibuat dalam tabel ini, tambahkan file PRIMARY KEYuntuk definisinya. Saat Anda melakukan ini, Anda juga perlu mendeklarasikan kolom yang diindeks menjadiNOT NULL, karena a PRIMARY KEY tidak mengizinkan NULL nilai -
CREATE TABLE person_tbl (
first_name CHAR(20) NOT NULL,
last_name CHAR(20) NOT NULL,
sex CHAR(10),
PRIMARY KEY (last_name, first_name)
);
Kehadiran indeks unik dalam tabel biasanya menyebabkan kesalahan terjadi jika Anda menyisipkan catatan ke dalam tabel yang menduplikasi catatan yang sudah ada di kolom atau kolom yang menentukan indeks.
Menggunakan INSERT IGNORE perintah daripada INSERTperintah. Jika sebuah record tidak menduplikasi record yang sudah ada, maka MySQL akan memasukkannya seperti biasa. Jika record adalah duplikat, maka fileIGNORE kata kunci memberitahu MySQL untuk membuangnya secara diam-diam tanpa menimbulkan kesalahan.
Contoh berikut tidak error dan pada saat yang sama tidak akan memasukkan record duplikat juga.
mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)
-> VALUES( 'Jay', 'Thomas');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)
-> VALUES( 'Jay', 'Thomas');
Query OK, 0 rows affected (0.00 sec)
Menggunakan REPLACEperintah daripada perintah INSERT. Jika record baru, itu dimasukkan seperti dengan INSERT. Jika itu adalah duplikat, catatan baru menggantikan yang lama.
mysql> REPLACE INTO person_tbl (last_name, first_name)
-> VALUES( 'Ajay', 'Kumar');
Query OK, 1 row affected (0.00 sec)
mysql> REPLACE INTO person_tbl (last_name, first_name)
-> VALUES( 'Ajay', 'Kumar');
Query OK, 2 rows affected (0.00 sec)
Perintah INSERT IGNORE dan REPLACE harus dipilih sesuai dengan perilaku penanganan duplikat yang ingin Anda lakukan. Perintah INSERT IGNORE menyimpan kumpulan pertama rekaman duplikat dan membuang sisanya. Perintah REPLACE menyimpan kumpulan duplikat terakhir dan menghapus yang sebelumnya.
Cara lain untuk menegakkan keunikan adalah dengan menambahkan file UNIQUE indeks daripada KUNCI UTAMA ke tabel.
CREATE TABLE person_tbl (
first_name CHAR(20) NOT NULL,
last_name CHAR(20) NOT NULL,
sex CHAR(10)
UNIQUE (last_name, first_name)
);
Menghitung dan Mengidentifikasi Duplikat
Berikut adalah query untuk menghitung record duplikat dengan first_name dan last_name dalam sebuah tabel.
mysql> SELECT COUNT(*) as repetitions, last_name, first_name
-> FROM person_tbl
-> GROUP BY last_name, first_name
-> HAVING repetitions > 1;
Kueri ini akan mengembalikan daftar semua rekaman duplikat di tabel person_tbl. Secara umum, untuk mengidentifikasi kumpulan nilai yang digandakan, ikuti langkah-langkah yang diberikan di bawah ini.
Tentukan kolom mana yang berisi nilai yang mungkin diduplikasi.
Buat daftar kolom tersebut dalam daftar pilihan kolom, bersama dengan COUNT(*).
Buat daftar kolom di GROUP BY klausa juga.
Tambah sebuah HAVING klausa yang menghilangkan nilai unik dengan mengharuskan jumlah grup lebih besar dari satu.
Menghilangkan Duplikat dari Hasil Query
Anda dapat menggunakan DISTINCT perintah bersama dengan pernyataan SELECT untuk mengetahui catatan unik yang tersedia dalam tabel.
mysql> SELECT DISTINCT last_name, first_name
-> FROM person_tbl
-> ORDER BY last_name;
Alternatif untuk perintah DISTINCT adalah menambahkan klausa GROUP BY yang memberi nama kolom yang Anda pilih. Ini memiliki efek menghapus duplikat dan memilih hanya kombinasi unik dari nilai di kolom yang ditentukan.
mysql> SELECT last_name, first_name
-> FROM person_tbl
-> GROUP BY (last_name, first_name);
Menghapus Duplikat Menggunakan Penggantian Tabel
Jika Anda memiliki rekaman duplikat dalam sebuah tabel dan Anda ingin menghapus semua rekaman duplikat dari tabel tersebut, ikuti prosedur yang diberikan di bawah ini.
mysql> CREATE TABLE tmp SELECT last_name, first_name, sex
-> FROM person_tbl;
-> GROUP BY (last_name, first_name);
mysql> DROP TABLE person_tbl;
mysql> ALTER TABLE tmp RENAME TO person_tbl;
Cara mudah untuk menghapus rekaman duplikat dari tabel adalah dengan menambahkan INDEX atau PRIMARY KEY ke tabel itu. Meskipun tabel ini sudah tersedia, Anda dapat menggunakan teknik ini untuk menghapus rekaman duplikat dan Anda juga akan aman di masa mendatang.
mysql> ALTER IGNORE TABLE person_tbl
-> ADD PRIMARY KEY (last_name, first_name);