Rumah >Java >javaTutorial >Cara Memadam Data Pendua daripada Pangkalan Data MySQL
데이터베이스 작업 시, 특히 대규모 데이터세트가 지속적으로 수정되거나 추가되는 환경에서는 중복된 데이터가 발생하는 경우가 많습니다. 이는 쿼리 성능의 비효율성, 데이터 불일치 및 부정확한 보고서로 이어질 수 있습니다. 다행스럽게도 MySQL은 이러한 중복 항목을 식별하고 제거할 수 있는 강력한 도구를 제공합니다.
이 블로그에서는 MySQL 데이터베이스에서 중복 레코드를 감지하고 중복 레코드를 제거하는 효율적이고 포괄적인 접근 방식을 안내해 드리겠습니다. 여기에 나와 있는 방법은 대부분의 관계형 데이터베이스 시스템에 적용 가능하지만, 이 튜토리얼에서는 MySQL에 중점을 둘 것입니다.
코드를 살펴보기 전에 중복의 조건을 정의하는 것이 중요합니다. 많은 경우 중복은 모든 열의 값이 동일한 단순한 레코드가 아닙니다. 종종 중복 항목은 키 열의 하위 집합에 동일한 값을 가질 수 있습니다. 예를 들어 users 테이블에서 두 레코드의 이메일은 동일하지만 사용자 이름 또는 signup_date와 같은 다른 필드가 다를 수 있습니다.
단순화를 위해 이 튜토리얼에서는 중복 항목이 모든 열(또는 열의 하위 집합)이 일치하는 행이라고 가정합니다.
id | first_name | last_name | 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.
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.
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.
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:
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.
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:
Kaedah ini berguna apabila kriteria untuk menentukan pendua untuk disimpan adalah lebih canggih daripada hanya menggunakan id.
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.
Apabila bekerja dengan set data yang besar, pemadaman pendua boleh menjadi perlahan dan intensif sumber. Berikut ialah beberapa petua untuk mengoptimumkan prestasi:
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.
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!