Bagaimana MySQL Hapus Baris Pendua

How Mysql Delete Duplicate Rows



MySQL adalah set data hubungan yang menyimpan data dalam jadual yang mempunyai baris dan lajur. Namun, data yang disimpan dalam pangkalan data mungkin mengandungi nilai pendua yang disebabkan oleh kesalahan dalam aplikasi atau pengguna.

Dalam tutorial ini, kita akan belajar bagaimana menghapus baris pendua dalam pangkalan data MySQL untuk mengurangkan ukuran pangkalan data dan membantu meningkatkan prestasi pelayan.







Sebelum meneruskan, kami menganggap:



  1. Anda telah memasang dan menjalankan MySQL pada sistem anda
  2. Anda mempunyai akses root ke pangkalan data.
  3. Anda mempunyai akses ke pangkalan data untuk bereksperimen atau menguji

CATATAN : Jika anda memerlukan contoh pangkalan data untuk mencuba konsep yang disediakan dalam panduan ini, harap pertimbangkan pangkalan data Sakila atau muat turun salinan pangkalan data yang digunakan dalam panduan ini.



Sumber disediakan di bawah:





Penggunaan Asas

Sebelum kita memulakan, kita secara sengaja akan membuat jadual yang mengandungi nilai pendua untuk tujuan pengujian. Pertanyaan SQL untuk melakukan tindakan ini adalah di bawah:

PENGGUNAAN dunia;
TURUNKAN JADUAL JIKA ADA pengguna;
BUAT JADUAL pengguna(ID INT KUNCI UTAMA TIDAK BULAN AUTO_INCREMENT ,nama pengguna VARCHAR (10) TIDAK BULAN ,nama penuh VARCHAR (dua puluh),e-mel VARCHAR (255) TIDAK BULAN );
MASUKKAN KE DALAM pengguna(nama pengguna,nama penuh,e-mel) NILAI
('Virgo', 'Claude M. Mori', '[dilindungi e-mel]'),
('tekan', 'Tiffany G. Bailey', '[dilindungi e-mel]'),
('roket', 'Christopher S. Payton', '[dilindungi e-mel]'),
('darkmatter', 'Patricia J. Fox', '[dilindungi e-mel]'),
('subjek', 'Faye H. Hartley', '[dilindungi e-mel]'),
('darkmatter', 'Patricia J. Fox', '[dilindungi e-mel]'),
('roket', 'Christopher S. Payton', '[dilindungi e-mel]'),
('artemis', 'Wesley C. Dillard', '[dilindungi e-mel]');

Jangan ragu untuk mengubah pertanyaan di atas agar sesuai dengan keperluan anda. Anda juga harus memastikan bahawa anda mempunyai pangkalan data (dunia) yang dibuat untuk mengelakkan kesilapan.



Sekarang, jika kita mendapatkan semua data di dalam jadual dan mengikut urutan nama pengguna, kita akan melihat pendua yang kita miliki seperti yang ditunjukkan:

mysql> menggunakan dunia;
Pangkalan data berubah
mysql> PILIH * DARI pengguna PERINTAH OLEH nama pengguna;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|ID|nama pengguna|nama penuh|e-mel|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |artemis|Wesley C. Dillard|[dilindungi e-mel]|
| 4 |tukang gelap|Patricia J. Fox|[dilindungi e-mel]|
| 6 |tukang gelap|Patricia J. Fox|[dilindungi e-mel]|
| 2 |tekan|Tiffany G. Bailey|[dilindungi e-mel]|
| 5 |subjek|Faye H. Hartley|[dilindungi e-mel]|
| 3 |roket|Christopher S. Payton|[dilindungi e-mel]|
| 7 |roket|Christopher S. Payton|[dilindungi e-mel]|
| 1 |Virgo|Claude M. Mori|[dilindungi e-mel]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

Seperti yang anda lihat dari jadual di atas, kami mempunyai dua nilai pendua yang menjadikan pangkalan data lebih besar tanpa sebab dan menyebabkan kelajuan perlahan.

Mari kita belajar bagaimana kita boleh membuang nilai-nilai ini.

# 1 - HAPUS BERSAMA

Salah satu cara untuk membuang baris pendua dalam pangkalan data adalah dengan menggunakan pernyataan MySQL DELETE JOIN. Walau bagaimanapun, pertanyaan menggunakan id untuk membuang nilai pendua.

Sebagai contoh, untuk membuang nilai pendua dalam jadual pengguna di atas, kita dapat memasukkan:

HAPUS jadual1 DARI jadual pengguna1 DALAM SERTAI jadual pengguna2 DI MANA jadual1.id<jadual2.id DAN jadual1. mel=jadual2.email;

Sebaik sahaja anda menjalankan pertanyaan di atas, anda akan membuang nilai pendua seperti yang ditunjukkan dalam output di bawah:

mysql> HAPUS jadual1 DARI jadual pengguna1 DALAM SERTAI jadual pengguna2 DI MANA jadual1.id<jadual2.id DAN jadual1. mel=jadual2.email;
Pertanyaan OK, 2barisan terjejas(0.01sek)

mysql> PILIH * DARI pengguna PERINTAH OLEH nama pengguna;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|ID|nama pengguna|nama penuh|e-mel|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |artemis|Wesley C. Dillard|[dilindungi e-mel]|
| 6 |tukang gelap|Patricia J. Fox|[dilindungi e-mel]|
| 2 |tekan|Tiffany G. Bailey|[dilindungi e-mel]|
| 5 |subjek|Faye H. Hartley|[dilindungi e-mel]|
| 7 |roket|Christopher S. Payton|[dilindungi e-mel]|
| 1 |Virgo|Claude M. Mori|[dilindungi e-mel]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

# 2 - Row_Number () Fungsi

Kaedah kedua yang dapat kita laksanakan adalah menggunakan fungsi baris_number () MySQL. Fungsi ini disokong dalam MySQL versi 8 dan lebih tinggi.

Ia berfungsi dengan memberikan nilai int berurutan ke setiap baris, dengan baris yang mengandungi nilai pendua mendapat nilai lebih tinggi dari 1.

Untuk mengetahui lebih lanjut mengenai fungsi ini, gunakan sumber yang disediakan di bawah:

https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_row-number

Pertimbangkan pertanyaan di bawah yang mengembalikan id baris dengan nilai pendua:

PILIH ID DARI ( PILIH ID,ROW_NUMBER()KESELURUHAN( BAHAGIAN MENGIKUT nama pengguna PERINTAH OLEH nama pengguna) SEBAGAI baris_var DARI pengguna)t1 DI MANA baris_var> 1;

Sebaik sahaja anda melaksanakan pertanyaan di atas, anda harus mendapatkan senarai id seperti yang ditunjukkan dalam output di bawah:

+ ---- +
|ID|
+ ---- +
| 6 |
| 7 |
+ ---- +
2barisan dalam set (0.01sek)

Sekiranya anda ingin membuang nilai, ganti pernyataan SELECT dengan pernyataan DELETE seperti yang ditunjukkan di bawah:

HAPUS DARI pengguna DI MANA ID DALAM ( PILIH ID DARI ( PILIH ID,ROW_NUMBER()KESELURUHAN( BAHAGIAN MENGIKUT nama pengguna PERINTAH OLEH nama pengguna) SEBAGAI baris_var DARI pengguna)t1 DI MANA baris_var> 1);

Akhirnya, anda dapat mengesahkan bahawa nilai pendua dikeluarkan menggunakan pernyataan SELECT.

mysql> PILIH * dari pengguna PERINTAH OLEH nama pengguna;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|ID|nama pengguna|nama penuh|e-mel|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |artemis|Wesley C. Dillard|[dilindungi e-mel]|
| 4 |tukang gelap|Patricia J. Fox|[dilindungi e-mel]|
| 2 |tekan|Tiffany G. Bailey|[dilindungi e-mel]|
| 5 |subjek|Faye H. Hartley|[dilindungi e-mel]|
| 3 |roket|Christopher S. Payton|[dilindungi e-mel]|
| 1 |Virgo|Claude M. Mori|[dilindungi e-mel]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

Kesimpulannya

Dalam tutorial ini, kami membincangkan dua kaedah membuang nilai pendua dari pangkalan data. Pangkalan data yang besar, terutama yang biasa digunakan, mungkin mengandungi banyak nilai pendua dari import luaran dan kesalahan lain. Oleh itu, ada keperluan untuk terus membersihkan nilai pendua untuk memastikan aplikasi berjalan dengan optimum.