MySQL Yinelenen Satırları Nasıl Silinir?

How Mysql Delete Duplicate Rows



MySQL, verileri satır ve sütunlardan oluşan tablolarda depolayan ilişkisel bir veri kümesidir. Ancak, veritabanında depolanan veriler, uygulamalardaki veya kullanıcılardaki hatalardan kaynaklanan mükerrer değerler içerebilir.

Bu öğreticide, veritabanı boyutunu küçültmek ve sunucu performansını artırmaya yardımcı olmak için MySQL veritabanındaki yinelenen satırları nasıl kaldıracağımızı öğreneceğiz.







Devam etmeden önce şunları varsayıyoruz:



  1. Sisteminizde MySQL kurulu ve çalışıyor
  2. Veritabanına kök erişiminiz var.
  3. Deneme veya test için bir veritabanına erişiminiz var

NOT : Bu kılavuzda verilen kavramları denemek için örnek bir veritabanına ihtiyacınız varsa, lütfen Sakila veritabanını düşünün veya bu kılavuzda kullanılan veritabanının bir kopyasını indirin.



Kaynaklar aşağıda verilmiştir:





Temel Kullanım

Başlamadan önce, test amacıyla kasıtlı olarak yinelenen değerler içeren bir tablo oluşturacağız. Bu eylemi gerçekleştirmek için SQL sorguları aşağıdadır:

KULLANMAK Dünya;
DÜŞÜRMEK TABLO EĞER VAR kullanıcılar;
OLUŞTURMAK TABLO kullanıcılar(İD INT BİRİNCİL ANAHTAR OLUMSUZ BOŞ OTOMATİK ARTIŞ ,Kullanıcı adı VARCHAR (10) OLUMSUZ BOŞ ,Ad Soyad VARCHAR (yirmi),e-posta VARCHAR (255) OLUMSUZ BOŞ );
SOKMAK İÇİNE kullanıcılar(Kullanıcı adı,Ad Soyad,e-posta) DEĞERLER
('Başak', 'Claude M. Mori', ' [e-posta korumalı]'),
('basmak', 'Tiffany G.Bailey', ' [e-posta korumalı]'),
('roket', 'Christopher S.Payton', ' [e-posta korumalı]'),
('karanlık madde', 'Patricia J.Fox', ' [e-posta korumalı]'),
('ders', 'Faye H. Hartley', ' [e-posta korumalı]'),
('karanlık madde', 'Patricia J.Fox', ' [e-posta korumalı]'),
('roket', 'Christopher S.Payton', ' [e-posta korumalı]'),
('Artemis', 'Wesley C. Dillard', ' [e-posta korumalı]');

İhtiyaçlarınıza uyacak şekilde yukarıdaki sorguyu değiştirmekten çekinmeyin. Ayrıca hatalardan kaçınmak için veritabanının (dünyanın) oluşturulduğundan emin olmalısınız.



Şimdi, tablonun içindeki tüm verileri ve kullanıcı adına göre sıralarsak, gösterilen kopyaları göreceğiz:

mysql> kullanmak Dünya;
Veri tabanı değişti
mysql> SEÇME * İTİBAREN kullanıcılar TARAFINDAN SİPARİŞ Kullanıcı adı;
+ ---- + ------------ + -------------------------- + ------- ---------------- +
|İD|Kullanıcı adı|Ad Soyad|e-posta|
+ ---- + ------------ + -------------------------- + ------- ---------------- +
| 8 |Artemis|Wesley C. Dillard|[e-posta korumalı]|
| 4 |karanlık madde|Patricia J. Fox|[e-posta korumalı]|
| 6 |karanlık madde|Patricia J. Fox|[e-posta korumalı]|
| 2 |basmak|Tiffany G. Bailey|[e-posta korumalı]|
| 5 |ders|Faye H. Hartley|[e-posta korumalı]|
| 3 |roket|Christopher S. Payton|[e-posta korumalı]|
| 7 |roket|Christopher S. Payton|[e-posta korumalı]|
| 1 |Başak|Claude M. Mori|[e-posta korumalı]|
+ ---- + ------------ + -------------------------- + ------- ---------------- +

Yukarıdaki tablodan da görebileceğiniz gibi, veritabanını sebepsiz yere büyüten ve yavaş hızlara neden olan iki kopya değerimiz var.

Şimdi bu değerleri nasıl kaldırabileceğimizi öğrenelim.

#1 – SİL KATIL

Bir veritabanındaki yinelenen satırları kaldırmanın bir yolu MySQL DELETE JOIN deyimini kullanmaktır. Ancak sorgu, yinelenen değerleri kaldırmak için kimlikleri kullanır.

Örneğin, yukarıdaki users tablosundaki yinelenen değerleri kaldırmak için şunu girebiliriz:

SİLMEK tablo 1 İTİBAREN kullanıcılar tablosu1 İÇ KATILMAK kullanıcılar tablosu2 NEREDE tablo1.id<tablo2.id VE tablo1.e-posta=tablo2.e-posta;

Yukarıdaki sorguyu yürüttüğünüzde, aşağıdaki çıktıda gösterildiği gibi yinelenen değerleri kaldıracaksınız:

mysql> SİLMEK tablo 1 İTİBAREN kullanıcılar tablosu1 İÇ KATILMAK kullanıcılar tablosu2 NEREDE tablo1.id<tablo2.id VE tablo1.e-posta=tablo2.e-posta;
sorgu tamam, 2etkilenen satırlar(0.01saniye)

mysql> SEÇME * İTİBAREN kullanıcılar TARAFINDAN SİPARİŞ Kullanıcı adı;
+ ---- + ------------ + -------------------------- + ------- ---------------- +
|İD|Kullanıcı adı|Ad Soyad|e-posta|
+ ---- + ------------ + -------------------------- + ------- ---------------- +
| 8 |Artemis|Wesley C. Dillard|[e-posta korumalı]|
| 6 |karanlık madde|Patricia J. Fox|[e-posta korumalı]|
| 2 |basmak|Tiffany G. Bailey|[e-posta korumalı]|
| 5 |ders|Faye H. Hartley|[e-posta korumalı]|
| 7 |roket|Christopher S. Payton|[e-posta korumalı]|
| 1 |Başak|Claude M. Mori|[e-posta korumalı]|
+ ---- + ------------ + -------------------------- + ------- ---------------- +

#2 – Satır_Sayı() İşlevi

Uygulayabileceğimiz ikinci yöntem ise MySQL row_number() işlevini kullanmaktır. Bu işlev MySQL sürüm 8 ve üzeri sürümlerde desteklenir.

Her satıra sıralı bir int değeri atayarak çalışır, yinelenen değerler içeren satırlar 1'den yüksek bir değer alır.

Bu işlev hakkında daha fazla bilgi edinmek için aşağıda verilen kaynağı kullanın:

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

Yinelenen değerlere sahip satırların kimliğini döndüren aşağıdaki sorguyu düşünün:

SEÇME İD İTİBAREN ( SEÇME İD,SATIR NUMARASI()ÜZERİNDE( BÖLÜM kullanıcı adı TARAFINDAN TARAFINDAN SİPARİŞ Kullanıcı adı) OLARAK satır_var İTİBAREN kullanıcılar)t1 NEREDE satır_var> 1;

Yukarıdaki sorguyu çalıştırdıktan sonra, aşağıdaki çıktıda gösterildiği gibi kimliklerin listesini almalısınız:

+ ---- +
|İD|
+ ---- +
| 6 |
| 7 |
+ ---- +
2satırlar içinde Ayarlamak (0.01saniye)

Değerleri kaldırmak istiyorsanız, aşağıda gösterildiği gibi SELECT ifadesini DELETE ifadesi ile değiştirmeniz yeterlidir:

SİLMEK İTİBAREN kullanıcılar NEREDE İD İÇİNDE ( SEÇME İD İTİBAREN ( SEÇME İD,SATIR NUMARASI()ÜZERİNDE( BÖLÜM kullanıcı adı TARAFINDAN TARAFINDAN SİPARİŞ Kullanıcı adı) OLARAK satır_var İTİBAREN kullanıcılar)t1 NEREDE satır_var> 1);

Son olarak, SELECT deyimini kullanarak yinelenen değerlerin kaldırıldığını doğrulayabilirsiniz.

mysql> SEÇME * itibaren kullanıcılar TARAFINDAN SİPARİŞ Kullanıcı adı;
+ ---- + ------------ + -------------------------- + ------- ---------------- +
|İD|Kullanıcı adı|Ad Soyad|e-posta|
+ ---- + ------------ + -------------------------- + ------- ---------------- +
| 8 |Artemis|Wesley C. Dillard|[e-posta korumalı]|
| 4 |karanlık madde|Patricia J. Fox|[e-posta korumalı]|
| 2 |basmak|Tiffany G. Bailey|[e-posta korumalı]|
| 5 |ders|Faye H. Hartley|[e-posta korumalı]|
| 3 |roket|Christopher S. Payton|[e-posta korumalı]|
| 1 |Başak|Claude M. Mori|[e-posta korumalı]|
+ ---- + ------------ + -------------------------- + ------- ---------------- +

Çözüm

Bu öğreticide, bir veritabanından yinelenen değerleri kaldırmanın iki yöntemini tartıştık. Büyük veritabanları, özellikle yaygın olarak kullanılanlar, dış içe aktarmalardan ve diğer hatalardan kaynaklanan birçok yinelenen değer içerebilir. Bu nedenle, uygulamaların en iyi şekilde çalışmasını sağlamak için yinelenen değerleri temizlemeye devam etmeye ihtiyaç vardır.