Cara Menemukan dan Menghapus Data Duplikat di MySQL: Panduan Lengkap dengan Contoh SQL

目次

1. Pendahuluan

Saat mengoperasikan basis data, tidak jarang menemui masalah seperti “rekaman duplikat yang dimasukkan” atau “data yang seharusnya unik muncul berkali‑kali.” Di lingkungan di mana basis data relasional seperti MySQL digunakan, mengekstrak dan mengelola data duplikat merupakan tugas penting untuk menjaga akurasi dan kualitas data.

Sebagai contoh, pada tabel bisnis inti seperti informasi anggota, data produk, dan riwayat pesanan, rekaman duplikat dapat dimasukkan karena kesalahan pengguna atau kesalahan sistem. Jika tidak ditangani, hal ini dapat mengurangi akurasi agregasi dan analisis, serta dapat menyebabkan bug atau masalah operasional yang tidak terduga.

Untuk menyelesaikan “masalah data duplikat” ini, Anda harus terlebih dahulu mengidentifikasi rekaman mana yang duplikat, lalu mengatur atau menghapus rekaman duplikat tersebut tergantung pada situasinya. Namun, menggunakan hanya pernyataan SELECT standar di MySQL seringkali tidak cukup untuk mendeteksi duplikat secara efisien. Teknik SQL yang sedikit lebih maju dan pendekatan praktis diperlukan.

Dalam artikel ini, kami fokus pada “Cara Mengekstrak Data Duplikat di MySQL”, mencakup segala hal mulai dari pernyataan SQL dasar hingga aplikasi praktis, pertimbangan kinerja, dan penanganan kesalahan umum. Baik Anda seorang pemula basis data maupun insinyur yang menulis SQL setiap hari, panduan ini bertujuan memberikan pengetahuan praktis yang berorientasi pada lapangan.

2. Dasar‑dasar: Mendeteksi Duplikat Menggunakan Kolom Kunci

Cara paling dasar untuk mengekstrak data duplikat di MySQL adalah mengidentifikasi kasus di mana “beberapa rekaman berbagi nilai yang sama pada kolom tertentu (kolom kunci).” Pada bagian ini, kami menjelaskan kueri SQL representatif yang digunakan untuk mendeteksi nilai kunci duplikat dan cara kerjanya.

2-1. Mendeteksi Duplikat dengan GROUP BY dan HAVING

Teknik fundamental untuk deteksi duplikat adalah mengelompokkan rekaman berdasarkan kolom tertentu menggunakan klausa GROUP BY, lalu menyaring grup yang berisi dua atau lebih rekaman menggunakan klausa HAVING. Berikut contoh tipikalnya:

SELECT key_column, COUNT(*) AS duplicate_count
FROM table_name
GROUP BY key_column
HAVING COUNT(*) > 1;

Contoh: Mengekstrak Alamat Email Anggota yang Duplikat

SELECT email, COUNT(*) AS count
FROM users
GROUP BY email
HAVING COUNT(*) > 1;

Saat kueri ini dijalankan, jika alamat email yang sama telah terdaftar berkali‑kali, alamat email dan jumlah duplikat (count) akan ditampilkan dalam hasil.

2-2. Mendeteksi Duplikat di Beberapa Kolom

Jika Anda perlu mendeteksi duplikat berdasarkan kombinasi dua kolom atau lebih, Anda dapat menentukan beberapa kolom dalam klausa GROUP BY dengan logika yang sama.

SELECT col1, col2, COUNT(*) AS duplicate_count
FROM table_name
GROUP BY col1, col2
HAVING COUNT(*) > 1;

Dengan metode ini, Anda dapat mendeteksi duplikat di mana beberapa kondisi cocok sepenuhnya, seperti “nama lengkap dan tanggal lahir yang sama” atau “ID produk dan tanggal pesanan yang sama.”

2-3. Menghitung Total Jumlah Rekaman Duplikat

Jika Anda ingin memahami skala keseluruhan duplikasi, Anda dapat menggunakan sub‑query untuk menghitung total jumlah entri duplikat.

SELECT SUM(duplicate_count) AS total_duplicates
FROM (
  SELECT COUNT(*) AS duplicate_count
  FROM table_name
  GROUP BY key_column
  HAVING COUNT(*) > 1
) AS duplicates;

Kueri ini menjumlahkan jumlah entri duplikat di semua grup duplikat.

Dengan menggabungkan GROUP BY dan HAVING, Anda dapat mengekstrak data duplikat di MySQL secara sederhana dan efisien.

3. Mengekstrak Semua Rekaman yang Memiliki Kunci Duplikat

Pada bagian sebelumnya, kami memperkenalkan cara menampilkan hanya “nilai kunci duplikat.” Namun, dalam pekerjaan dunia nyata, Anda sering perlu mengonfirmasi “rekaman mana yang tepat duplikat, dan memeriksa semua detailnya.” Misalnya, Anda mungkin ingin meninjau profil pengguna yang duplikat secara lengkap atau memeriksa data produk yang duplikat baris per baris.

Pada bagian ini, kami menjelaskan pola SQL praktis untuk mengekstrak semua catatan yang memiliki kunci duplikat.

3-1. Mengekstrak Catatan Duplikat Menggunakan Subquery

Pendekatan paling dasar adalah mengambil daftar nilai kunci duplikat dalam sebuah subquery, kemudian mengambil semua catatan yang cocok dengan kunci tersebut.

SELECT *
FROM table_name
WHERE key_column IN (
  SELECT key_column
  FROM table_name
  GROUP BY key_column
  HAVING COUNT(*) > 1
);

Contoh: Mengekstrak Semua Catatan dengan Alamat Email Duplikat

SELECT *
FROM users
WHERE email IN (
  SELECT email
  FROM users
  GROUP BY email
  HAVING COUNT(*) > 1
);

Saat Anda menjalankan kueri ini, ia mengekstrak semua baris dalam tabel “users” di mana alamat email duplikat (termasuk kolom seperti ID, tanggal pendaftaran, dll.).

3-2. Ekstraksi Efisien Menggunakan EXISTS

Jika Anda perlu menangani dataset besar atau memperhatikan kinerja, menggunakan EXISTS juga dapat efektif. IN dan EXISTS serupa, tetapi tergantung pada volume data dan pengindeksan, salah satunya mungkin lebih cepat daripada yang lain.

SELECT *
FROM table_name t1
WHERE EXISTS (
  SELECT 1
  FROM table_name t2
  WHERE t1.key_column = t2.key_column
  GROUP BY t2.key_column
  HAVING COUNT(*) > 1
);

Contoh: Catatan Email Duplikat (Menggunakan EXISTS)

SELECT *
FROM users u1
WHERE EXISTS (
  SELECT 1
  FROM users u2
  WHERE u1.email = u2.email
  GROUP BY u2.email
  HAVING COUNT(*) > 1
);

3-3. Catatan dan Pertimbangan Kinerja

  • Kinerja subquery dapat terpengaruh secara signifikan ketika dataset besar. Dengan pengindeksan yang tepat, baik IN maupun EXISTS dapat beroperasi pada tingkat yang praktis.
  • Namun, jika Anda memerlukan kondisi kompleks atau ingin menentukan duplikat di beberapa kolom, kueri dapat menjadi berat. Selalu validasi perilaku di lingkungan pengujian terlebih dahulu.

Dengan cara ini, mengekstrak semua catatan yang cocok dengan kunci duplikat dapat dicapai menggunakan subquery atau klausa EXISTS.

4. Mendeteksi Duplikat di Beberapa Kolom

Kondisi deteksi duplikat tidak selalu berdasarkan satu kolom. Dalam praktik, umum memerlukan keunikan di seluruh kombinasi beberapa kolom. Misalnya, Anda dapat menganggap catatan duplikat ketika “nama lengkap + tanggal lahir” cocok, atau ketika “ID produk + warna + ukuran” semuanya identik.

Pada bagian ini, kami menjelaskan secara detail cara mengekstrak duplikat menggunakan beberapa kolom.

4-1. Mendeteksi Duplikat dengan GROUP BY Menggunakan Beberapa Kolom

Untuk mendeteksi duplikat di beberapa kolom, daftarkan kolom yang dipisahkan koma dalam klausa GROUP BY. Dengan HAVING COUNT(*) > 1, Anda dapat mengekstrak hanya kombinasi yang muncul dua kali atau lebih.

SELECT col1, col2, COUNT(*) AS duplicate_count
FROM table_name
GROUP BY col1, col2
HAVING COUNT(*) > 1;

Contoh: Mendeteksi Duplikat berdasarkan “first_name” dan “birthday”

SELECT first_name, birthday, COUNT(*) AS count
FROM users
GROUP BY first_name, birthday
HAVING COUNT(*) > 1;

Kueri ini membantu Anda mengidentifikasi kasus di mana kombinasi “nama yang sama” dan “tanggal lahir yang sama” telah terdaftar berkali-kali.

4-2. Mengekstrak Semua Catatan untuk Kunci Multi-Kolom Duplikat

Jika Anda memerlukan semua detail catatan untuk kombinasi kunci duplikat, Anda dapat mengekstrak pasangan duplikat dalam sebuah subquery dan kemudian mengambil semua baris yang cocok dengan pasangan tersebut.

SELECT *
FROM table_name t1
WHERE (col1, col2) IN (
  SELECT col1, col2
  FROM table_name
  GROUP BY col1, col2
  HAVING COUNT(*) > 1
);

Contoh: Catatan Lengkap untuk Duplikat dalam “first_name” dan “birthday”

SELECT *
FROM users u1
WHERE (first_name, birthday) IN (
  SELECT first_name, birthday
  FROM users
  GROUP BY first_name, birthday
  HAVING COUNT(*) > 1
);

Dengan kueri ini, misalnya, jika kombinasi “Taro Tanaka / 1990-01-01” terdaftar berkali-kali, Anda dapat mengambil semua baris detail terkait.

4-3. Mendeteksi Duplikat Tepat (COUNT DISTINCT)

Jika Anda ingin memperkirakan “berapa banyak baris yang merupakan duplikat persis di beberapa kolom,” Anda juga dapat menggunakan agregasi dengan COUNT(DISTINCT ...).

SELECT COUNT(*) - COUNT(DISTINCT col1, col2) AS duplicate_count
FROM table_name;

SQL ini memberikan perkiraan jumlah baris yang sepenuhnya duplikat dalam tabel.

4-4. Notes

  • Bahkan untuk deteksi duplikat multi‑kolom, indeks yang tepat dapat secara signifikan meningkatkan kecepatan kueri.
  • Jika banyak kolom yang terlibat atau nilai NULL hadir, Anda mungkin mendapatkan hasil duplikat yang tidak terduga. Rancang kondisi Anda dengan hati‑hati.

Dengan cara ini, mendeteksi dan mengekstrak duplikat di beberapa kolom dapat ditangani secara fleksibel dengan SQL yang dirancang dengan baik.

5. Menghapus Rekaman Duplikat (DELETE)

Setelah Anda dapat mengekstrak data duplikat, langkah selanjutnya adalah menghapus duplikat yang tidak diperlukan. Dalam praktiknya, pendekatan umum adalah menyimpan hanya satu rekaman di antara duplikat dan menghapus sisanya. Namun, saat menghapus duplikat secara otomatis di MySQL, Anda harus mempersempit target penghapusan dengan hati‑hati untuk menghindari kehilangan data yang tidak diinginkan.

Pada bagian ini, kami menjelaskan metode aman umum untuk menghapus data duplikat dan langkah‑langkah penting.

5-1. Menghapus Duplikat dengan Subquery + DELETE

Jika Anda ingin menyimpan hanya rekaman “terlama” atau “terbaru” dan menghapus yang lainnya, pernyataan DELETE dengan subquery dapat berguna.

Contoh: Simpan rekaman ID terkecil (terlama) dan hapus yang lainnya

DELETE FROM users
WHERE id NOT IN (
  SELECT MIN(id)
  FROM users
  GROUP BY email
);

Kueri ini menyimpan hanya id terkecil (rekaman pertama yang terdaftar) untuk setiap email, dan menghapus semua baris lain yang memiliki email yang sama.

5-2. Cara Menghindari Kesalahan Spesifik MySQL (Error 1093)

Di MySQL, Anda mungkin menemui Error 1093 ketika mencoba DELETE dari sebuah tabel sekaligus merujuk tabel yang sama dalam subquery. Dalam kasus tersebut, Anda dapat menghindari kesalahan dengan membungkus hasil subquery sebagai tabel turunan (set hasil sementara).

DELETE FROM users
WHERE id NOT IN (
  SELECT * FROM (
    SELECT MIN(id)
    FROM users
    GROUP BY email
  ) AS temp_ids
);

Dengan membungkus subquery menggunakan SELECT * FROM (...) AS alias, Anda dapat mencegah kesalahan dan menghapus dengan aman.

5-3. Menghapus Duplikat untuk Kunci Multi‑Kolom

Jika Anda ingin menghapus duplikat berdasarkan kombinasi beberapa kolom, gunakan GROUP BY dengan beberapa kolom dan hapus semua kecuali rekaman perwakilan.

Contoh: Untuk duplikat berdasarkan “first_name” dan “birthday”, hapus semua kecuali rekaman pertama

DELETE FROM users
WHERE id NOT IN (
  SELECT * FROM (
    SELECT MIN(id)
    FROM users
    GROUP BY first_name, birthday
  ) AS temp_ids
);

5-4. Langkah Keamanan dan Praktik Terbaik untuk Penghapusan

Menghapus duplikat adalah operasi berisiko tinggi yang dapat menghapus data secara permanen. Pastikan untuk mengikuti praktik terbaik berikut:

  • Ambil cadangan : Selalu simpan cadangan seluruh tabel atau rekaman target sebelum menghapus.
  • Gunakan transaksi : Jika memungkinkan, bungkus operasi dalam sebuah transaksi sehingga Anda dapat melakukan rollback segera jika terjadi masalah.
  • Konfirmasi jumlah dengan SELECT terlebih dahulu : Bangun kebiasaan memverifikasi “Apakah target penghapusan sudah benar?” dengan menjalankan kueri SELECT terlebih dahulu.
  • Periksa indeks : Menambahkan indeks pada kolom yang digunakan untuk deteksi duplikat meningkatkan kinerja dan akurasi.

Di MySQL, Anda dapat menghapus data duplikat dengan aman menggunakan subquery dan tabel turunan. Selalu lakukan dengan hati‑hati, dengan pengujian yang memadai dan strategi cadangan yang solid.

6. Pertimbangan Kinerja dan Strategi Indeks

Saat mengekstrak atau menghapus data duplikat di MySQL, waktu eksekusi query dan beban server menjadi lebih bermasalah seiring bertambahnya ukuran tabel. Terutama di sistem skala besar atau pekerjaan batch, desain SQL yang sadar performa dan optimalisasi indeks sangat penting. Di bagian ini, kami menjelaskan tips untuk meningkatkan performa dan poin kunci untuk desain indeks dalam pemrosesan data duplikat.

6-1. Memilih Antara EXISTS, IN, dan JOIN

Konstruksi SQL seperti IN, EXISTS, dan JOIN umum digunakan untuk mengekstrak data duplikat, tetapi masing-masing memiliki karakteristik dan kecenderungan performa yang berbeda.

  • IN – Cepat ketika hasil set subquery kecil, tetapi performa cenderung menurun seiring bertambahnya ukuran hasil set.
  • EXISTS – Berhenti mencari segera setelah catatan yang cocok ditemukan, sehingga sering efektif untuk tabel besar atau ketika kecocokan relatif jarang.
  • JOIN – Berguna untuk mengambil banyak informasi sekaligus, tetapi bisa menjadi lebih lambat jika Anda bergabung dengan data yang tidak perlu atau kurang indeks yang tepat.

Contoh Perbandingan Performa

SyntaxSmall DataLarge DataComment
INSlow when the result set is large
EXISTSAdvantageous for large databases
JOINProper indexes required

Penting untuk memilih sintaks optimal berdasarkan sistem dan volume data aktual Anda.

6-2. Mengapa Desain Indeks Penting

Untuk kolom yang digunakan dalam pemeriksaan duplikat atau filter penghapusan, selalu buat indeks. Tanpa indeks, pemindaian tabel penuh bisa terjadi dan performa bisa menjadi sangat lambat.

Contoh: Membuat Indeks

CREATE INDEX idx_email ON users(email);

Jika Anda mendeteksi duplikat di seluruh beberapa kolom, indeks komposit juga efektif.

CREATE INDEX idx_name_birthday ON users(first_name, birthday);

Desain indeks dapat mengubah secara dramatis performa baca dan efisiensi pencarian.
Catatan: Menambahkan terlalu banyak indeks dapat memperlambat tulisan dan meningkatkan penggunaan penyimpanan, jadi keseimbangan penting.

6-3. Pemrosesan Batch untuk Dataset Besar

  • Jika dataset berukuran puluhan ribu hingga jutaan baris, lebih aman menjalankan pemrosesan dalam batch yang lebih kecil daripada menangani semuanya sekaligus.
  • Untuk penghapusan dan pembaruan, batasi jumlah baris yang diproses per eksekusi (misalnya, LIMIT 1000 ) dan jalankan beberapa kali untuk mengurangi persaingan kunci dan degradasi performa. DELETE FROM users WHERE id IN ( -- ID catatan duplikat pertama 1000 yang diekstrak oleh subquery ) LIMIT 1000;

6-4. Menggunakan Rencana Eksekusi (EXPLAIN)

Gunakan EXPLAIN untuk menganalisis bagaimana sebuah query dieksekusi. Ini membantu Anda memeriksa apakah indeks digunakan secara efektif, dan apakah pemindaian penuh (ALL) terjadi.

EXPLAIN SELECT * FROM users WHERE email IN (...);

Dengan menjaga performa dan strategi indeks di pikiran, Anda dapat menangani pemrosesan duplikat secara aman dan efisien bahkan untuk dataset besar.

7. Kasus Penggunaan Lanjutan: Menangani Skenario Kompleks

Di lingkungan dunia nyata, deteksi dan penghapusan duplikat sering kali lebih kompleks daripada pencocokan sederhana. Anda mungkin perlu menambahkan kondisi tambahan, mengeksekusi operasi secara aman dalam tahap-tahap, atau memenuhi persyaratan operasional yang lebih ketat. Di bagian ini, kami memperkenalkan teknik praktis lanjutan untuk menangani data duplikat secara aman dan fleksibel.

7-1. Penghapusan Duplikat Bersyarat

Jika Anda ingin menghapus hanya duplikat yang memenuhi kondisi tertentu, gunakan klausa WHERE secara strategis.

Contoh: Hapus hanya catatan duplikat dengan email yang sama dan status = 'withdrawn'

DELETE FROM users
WHERE id NOT IN (
  SELECT * FROM (
    SELECT MIN(id)
    FROM users
    WHERE status = 'withdrawn'
    GROUP BY email
  ) AS temp_ids
)
AND status = 'withdrawn';

Dengan menambahkan kondisi ke WHERE dan GROUP BY, Anda dapat mengontrol secara presisi catatan mana yang dipertahankan dan mana yang dihapus.

7-2. Direkomendasikan: Pemrosesan Batch dan Eksekusi Terpisah

Jika dataset sangat besar atau Anda ingin menghindari persaingan kunci dan degradasi performa, gunakan pemrosesan batch.

  • Jangan memproses semua target penghapusan sekaligus—gunakan LIMIT untuk eksekusi terpisah
  • Gunakan kontrol transaksi dan lakukan rollback jika terjadi kesalahan tak terduga
  • Kelola risiko dengan backup dan pencatatan DELETE FROM users WHERE id IN ( SELECT id FROM ( -- Extract duplicate record IDs filtered by conditions ) AS temp_ids ) LIMIT 500;

Pendekatan ini secara signifikan mengurangi beban sistem.

7-3. Menangani Definisi Duplikat yang Kompleks

Dalam konteks bisnis yang berbeda, definisi “duplikat” bervariasi. Anda dapat menggabungkan subquery, ekspresi CASE, dan fungsi agregat untuk penanganan yang fleksibel.

Contoh: Pertimbangkan duplikat hanya ketika product_id, order_date, dan price semuanya identik

SELECT product_id, order_date, price, COUNT(*)
FROM orders
GROUP BY product_id, order_date, price
HAVING COUNT(*) > 1;

Untuk kebutuhan yang lebih maju seperti “menyimpan hanya catatan terbaru di antara duplikat,” Anda dapat menggunakan subquery atau ROW_NUMBER() (tersedia di MySQL 8.0 dan yang lebih baru).

7-4. Praktik Terbaik untuk Transaksi dan Backup

  • Selalu bungkus operasi DELETE atau UPDATE dalam transaksi sehingga Anda dapat memulihkan data dengan ROLLBACK jika terjadi masalah.
  • Jika bekerja dengan tabel penting atau dataset besar, selalu buat backup terlebih dahulu.

Dengan menguasai teknik lanjutan ini, Anda dapat menangani pemrosesan data duplikat secara aman dan fleksibel di lingkungan apa pun.

8. Ringkasan

Dalam artikel ini, kami secara sistematis menjelaskan cara mengekstrak dan menghapus data duplikat di MySQL, mulai dari dasar hingga aplikasi lanjutan. Mari tinjau poin-poin penting.

8-1. Poin Penting

  • Mendeteksi Data Duplikat Anda dapat mendeteksi duplikat tidak hanya pada satu kolom tetapi juga pada beberapa kolom. Kombinasi GROUP BY dan HAVING COUNT(*) > 1 adalah pola dasar untuk deteksi duplikat.
  • Mengekstrak Semua Rekaman Duplikat Dengan menggunakan subquery dan klausa EXISTS, Anda dapat mengambil semua rekaman yang sesuai dengan nilai kunci duplikat.
  • Menghapus Rekaman Duplikat Dengan menggunakan MIN(id) atau MAX(id) untuk mempertahankan baris perwakilan dan menggabungkan subquery dengan pernyataan DELETE, Anda dapat menghapus duplikat yang tidak diperlukan dengan aman. Menghindari MySQL Error 1093 juga penting.
  • Kinerja dan Pengindeksan Untuk dataset besar atau kondisi kompleks, pengindeksan yang tepat, pemrosesan batch, dan pemeriksaan rencana eksekusi menggunakan EXPLAIN sangat penting.
  • Teknik Praktis Penghapusan bersyarat, eksekusi terpisah, manajemen transaksi, dan backup adalah praktik kunci untuk menghindari kesalahan di lingkungan produksi.

8-2. Referensi Cepat Berdasarkan Kasus Penggunaan

ScenarioRecommended Approach
Single-column duplicate detectionGROUP BY + HAVING
Multi-column duplicate detectionGROUP BY (multiple columns) + HAVING
Retrieve all duplicate recordsSubquery (IN / EXISTS)
Safe deletionSubquery + derived table + DELETE
High-speed processing of large datasetsIndexes + batch processing + EXPLAIN
Conditional duplicate deletionCombine WHERE clause and transactions

8-3. Mencegah Masalah Duplikat di Masa Depan

Mencegah duplikat pada saat penyisipan juga sama pentingnya.

  • Pertimbangkan menggunakan constraint UNIQUE saat merancang tabel.
  • Pembersihan data secara rutin dan audit membantu mendeteksi masalah operasional lebih awal.

Mengekstrak dan menghapus data duplikat di MySQL memerlukan pengetahuan mulai dari SQL dasar hingga teknik lanjutan. Kami berharap panduan ini mendukung pemeliharaan basis data dan operasi sistem Anda.
Jika Anda memiliki kasus spesifik atau pertanyaan lebih lanjut, pertimbangkan untuk memeriksa FAQ atau berkonsultasi dengan spesialis basis data.

9. FAQ: Pertanyaan yang Sering Diajukan tentang Mengekstrak dan Menghapus Data Duplikat di MySQL

Q1. Mengapa menggunakan GROUP BY + HAVING alih-alih DISTINCT?

DISTINCT menghapus duplikat dalam hasil set, tetapi tidak dapat memberi tahu berapa kali suatu nilai muncul. Dengan menggabungkan GROUP BY dan HAVING COUNT(*) > 1, Anda dapat menentukan nilai mana yang muncul berulang kali dan berapa banyak duplikat yang ada.

Q2. Haruskah saya menggunakan IN atau EXISTS?

Untuk dataset kecil, perbedaannya minimal. Untuk tabel besar atau ketika indeks efektif, EXISTS seringkali memberikan kinerja lebih baik. Uji kedua pendekatan di lingkungan Anda dan verifikasi rencana eksekusi menggunakan EXPLAIN.

Q3. Bagaimana cara mendeteksi duplikat di beberapa kolom?

Specify multiple columns in GROUP BY and use HAVING COUNT(*) > 1 to detect combinations where all specified columns match. Example: GROUP BY first_name, birthday

Q4. Saya mendapatkan Error 1093 saat menjalankan DELETE. Apa yang harus saya lakukan?

MySQL menghasilkan Error 1093 ketika Anda merujuk tabel yang sama dalam subquery di dalam pernyataan DELETE. Bungkus hasil subquery dalam tabel turunan menggunakan SELECT * FROM (...) AS alias untuk menghindari error tersebut.

Q5. Bagaimana cara menghapus data duplikat dengan aman?

Selalu buat cadangan sebelum menghapus, verifikasi target dengan pernyataan SELECT, dan gunakan transaksi bila memungkinkan. Penghapusan batch juga dapat lebih aman untuk dataset yang besar.

Q6. Apa yang harus saya lakukan jika kueri berjalan lambat dengan volume data yang besar?

Buat indeks pada kolom yang digunakan untuk deteksi duplikat. Gunakan pemrosesan batch dengan LIMIT dan periksa rencana eksekusi menggunakan EXPLAIN untuk menghindari pemindaian tabel penuh yang tidak perlu.

Q7. Bagaimana cara mencegah penyisipan duplikat secara fundamental?

Tentukan constraint UNIQUE atau kunci unik saat merancang tabel untuk mencegah nilai duplikat dimasukkan. Selain itu, lakukan pemeriksaan duplikat secara berkala dan pembersihan data setelah deployment.

Q8. Apakah metode yang sama dapat digunakan di MariaDB atau RDBMS lain?

Konstruksi SQL dasar seperti GROUP BY, HAVING, dan subquery juga didukung di MariaDB dan PostgreSQL. Namun, pembatasan subquery DELETE dan karakteristik kinerja dapat berbeda antar produk, jadi selalu uji terlebih dahulu.