Rumah  >  Artikel  >  Java  >  Cara Memadam Data Pendua daripada Pangkalan Data MySQL

Cara Memadam Data Pendua daripada Pangkalan Data MySQL

Linda Hamilton
Linda Hamiltonasal
2024-09-27 06:14:30736semak imbas

How to Delete Duplicate Data from a MySQL Database

소개

데이터베이스 작업 시, 특히 대규모 데이터세트가 지속적으로 수정되거나 추가되는 환경에서는 중복된 데이터가 발생하는 경우가 많습니다. 이는 쿼리 성능의 비효율성, 데이터 불일치 및 부정확한 보고서로 이어질 수 있습니다. 다행스럽게도 MySQL은 이러한 중복 항목을 식별하고 제거할 수 있는 강력한 도구를 제공합니다.

이 블로그에서는 MySQL 데이터베이스에서 중복 레코드를 감지하고 중복 레코드를 제거하는 효율적이고 포괄적인 접근 방식을 안내해 드리겠습니다. 여기에 나와 있는 방법은 대부분의 관계형 데이터베이스 시스템에 적용 가능하지만, 이 튜토리얼에서는 MySQL에 중점을 둘 것입니다.

중복을 구성하는 것은 무엇입니까?

코드를 살펴보기 전에 중복의 조건을 정의하는 것이 중요합니다. 많은 경우 중복은 모든 열의 값이 동일한 단순한 레코드가 아닙니다. 종종 중복 항목은 키 열의 하위 집합에 동일한 값을 가질 수 있습니다. 예를 들어 users 테이블에서 두 레코드의 이메일은 동일하지만 사용자 이름 또는 signup_date와 같은 다른 필드가 다를 수 있습니다.

단순화를 위해 이 튜토리얼에서는 중복 항목이 모든 열(또는 열의 하위 집합)이 일치하는 행이라고 가정합니다.

다음 직원 테이블 예를 살펴보세요.

id first_name last_name email salary
1 John Doe john@example.com 60000
2 Jane Smith jane@example.com 65000
3 John Doe john@example.com 60000
4 Alex Johnson alex@example.com 72000
5 John Doe john@example.com 60000

Di sini, baris dengan id = 1, id = 3 dan id = 5 ialah pendua. Matlamat kami adalah untuk mengalih keluarnya sambil menyimpan hanya satu salinan.

Panduan Langkah demi Langkah untuk Alih Keluar Pendua

1. Kenalpasti Rekod Pendua

Langkah pertama ialah mengenal pasti rekod yang diduplikasi. Untuk melakukan ini, kita perlu mengumpulkan rekod mengikut lajur yang sepatutnya unik. Dalam kes ini, mari kita anggap gabungan nama_pertama, nama_akhir dan e-mel hendaklah unik.

Anda boleh menggunakan pertanyaan berikut untuk mencari pendua:

SELECT first_name, last_name, email, COUNT(*)
FROM employees
GROUP BY first_name, last_name, email
HAVING COUNT(*) > 1;

Pertanyaan ini mengumpulkan rekod berdasarkan lajur first_name, last_name dan e-mel, dan hanya menunjukkan kumpulan dengan lebih daripada satu kejadian, iaitu pendua.

2. Pilih Baris Pendua untuk Simpan atau Padam

Selepas mengenal pasti pendua, kami memerlukan kaedah untuk mengalih keluarnya. Pendekatan biasa ialah menyimpan rekod dengan id terkecil atau terbesar dan memadamkan yang lain. Kita boleh melakukan ini menggunakan sertai sendiri untuk memadankan setiap rekod pendua dengan rekod yang ingin kita simpan.

Contoh:
DELETE e1
FROM employees e1
JOIN employees e2
ON e1.first_name = e2.first_name
AND e1.last_name = e2.last_name
AND e1.email = e2.email
AND e1.id > e2.id;

Pertanyaan ini berfungsi seperti berikut:

  • Ia melakukan sertai sendiri pada jadual pekerja di mana rekod mempunyai nama pertama, nama keluarga dan e-mel yang sama.
  • Ia memastikan bahawa hanya baris dengan id yang lebih tinggi (bermakna ia telah dimasukkan kemudian) akan dipadamkan, sambil menyimpan rekod dengan id terkecil.

3. Gunakan Jadual Sementara untuk Senario Lebih Kompleks

Dalam sesetengah situasi, anda mungkin mempunyai syarat yang lebih kompleks untuk menentukan pendua yang perlu disimpan, seperti mengekalkan rekod dengan tarikh_pendaftaran terkini atau gaji tertinggi.

Dalam kes sedemikian, anda boleh menggunakan jadual sementara untuk menyimpan baris yang anda mahu simpan dan kemudian memadamkan semua yang lain.

Contoh:
CREATE TEMPORARY TABLE temp_employees AS
SELECT * FROM employees e1
WHERE e1.id IN (
    SELECT MIN(id)
    FROM employees
    GROUP BY first_name, last_name, email
);

DELETE FROM employees
WHERE id NOT IN (SELECT id FROM temp_employees);

Inilah yang dilakukan oleh pertanyaan ini:

  1. Mencipta jadual sementara temp_employees yang mengandungi hanya satu rekod unik untuk setiap gabungan nama_pertama, nama_akhir dan e-mel (dalam kes ini, rekod dengan id terkecil).
  2. Memadamkan semua rekod daripada jadual pekerja asal yang tidak terdapat dalam jadual temp_employees.

Kaedah ini berguna apabila kriteria untuk menentukan pendua untuk disimpan adalah lebih canggih daripada hanya menggunakan id.

4. Tambahkan Kekangan Unik untuk Mencegah Pendua Masa Depan

Setelah anda membersihkan pendua, adalah idea yang baik untuk mengelakkannya daripada berulang. Anda boleh mencapai ini dengan menambahkan kekangan unik pada lajur yang berkaitan.

Contohnya, untuk menghalang sebarang baris masa hadapan dengan nama_pertama, nama_keluarga dan e-mel yang sama:

ALTER TABLE employees
ADD CONSTRAINT unique_employee
UNIQUE (first_name, last_name, email);

Ini memastikan bahawa pangkalan data akan menimbulkan ralat jika percubaan dibuat untuk memasukkan rekod pendua, sekali gus mengekalkan integriti data.

Pertimbangan Prestasi

Apabila bekerja dengan set data yang besar, pemadaman pendua boleh menjadi perlahan dan intensif sumber. Berikut ialah beberapa petua untuk mengoptimumkan prestasi:

  • Pengindeksan: Pastikan lajur yang terlibat dalam penapisan (seperti nama_pertama, nama_akhir, e-mel) diindeks. Ini boleh mempercepatkan proses dengan ketara.
  • Pemadaman Kelompok: Jika anda memadamkan sebilangan besar baris, pertimbangkan untuk melakukannya secara berkelompok untuk mengelakkan kunci panjang dan mengurangkan beban pada pelayan.

Contoh pemadaman kelompok:

DELETE e1
FROM employees e1
JOIN employees e2
ON e1.first_name = e2.first_name
AND e1.last_name = e2.last_name
AND e1.email = e2.email
AND e1.id > e2.id
LIMIT 1000;

Anda boleh menjalankan pertanyaan ini beberapa kali sehingga semua pendua dialih keluar.

Kesimpulan

Berurusan dengan rekod pendua dalam pangkalan data MySQL adalah tugas biasa yang, jika dikendalikan secara salah, boleh menyebabkan kehilangan data atau hasil yang tidak konsisten. Menggunakan langkah-langkah yang digariskan dalam blog ini, anda boleh mengalih keluar pendua dengan yakin dan cekap sambil mengekalkan integriti data anda. Selain itu, dengan menambahkan kekangan unik, anda boleh memastikan pendua masa depan dihalang, membantu mengekalkan set data yang bersih dan boleh dipercayai.

Atas ialah kandungan terperinci Cara Memadam Data Pendua daripada Pangkalan Data MySQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn