MySQL - Yinelenenleri İşleme
Genellikle, tablolar veya sonuç kümeleri bazen yinelenen kayıtlar içerir. Çoğu zaman izin verilir, ancak bazen yinelenen kayıtları durdurmak gerekir. Yinelenen kayıtların belirlenmesi ve tablodan kaldırılması gerekir. Bu bölümde, bir tabloda yinelenen kayıtların oluşmasının nasıl önleneceği ve zaten var olan yinelenen kayıtların nasıl kaldırılacağı anlatılacaktır.
Bir Tabloda Yinelemelerin Oluşmasını Önleme
Kullanabilirsin PRIMARY KEY veya a UNIQUE Yinelenen kayıtları durdurmak için uygun alanlara sahip bir tablo üzerinde dizin oluşturun.
Bir örnek alalım - Aşağıdaki tablo böyle bir dizin veya birincil anahtar içermez, bu nedenle, first_name ve last_name.
CREATE TABLE person_tbl (
first_name CHAR(20),
last_name CHAR(20),
sex CHAR(10)
);
Bu tabloda aynı ad ve soyad değerlerine sahip birden çok kaydın oluşturulmasını önlemek için bir PRIMARY KEYtanımına. Bunu yaptığınızda, indekslenmiş sütunların daNOT NULL, Çünkü PRIMARY KEY izin vermiyor NULL değerler -
CREATE TABLE person_tbl (
first_name CHAR(20) NOT NULL,
last_name CHAR(20) NOT NULL,
sex CHAR(10),
PRIMARY KEY (last_name, first_name)
);
Bir tabloda benzersiz bir dizinin varlığı, normalde, dizini tanımlayan sütun veya sütunlarda var olan bir kaydı çoğaltan tabloya bir kayıt eklerseniz bir hatanın oluşmasına neden olur.
Kullan INSERT IGNORE yerine komut INSERTkomut. Bir kayıt mevcut bir kaydı çoğaltmazsa, MySQL onu her zamanki gibi ekler. Kayıt bir kopyaysa,IGNORE anahtar kelime MySQL'e bir hata oluşturmadan onu sessizce atmasını söyler.
Aşağıdaki örnek hata vermez ve aynı zamanda yinelenen kayıtları da eklemeyecektir.
mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)
-> VALUES( 'Jay', 'Thomas');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)
-> VALUES( 'Jay', 'Thomas');
Query OK, 0 rows affected (0.00 sec)
Kullan REPLACEINSERT komutu yerine komut. Kayıt yeniyse, INSERT'te olduğu gibi eklenir. Kopya ise, yeni kayıt eskisinin yerini alır.
mysql> REPLACE INTO person_tbl (last_name, first_name)
-> VALUES( 'Ajay', 'Kumar');
Query OK, 1 row affected (0.00 sec)
mysql> REPLACE INTO person_tbl (last_name, first_name)
-> VALUES( 'Ajay', 'Kumar');
Query OK, 2 rows affected (0.00 sec)
INSERT IGNORE ve REPLACE komutları, etkilemek istediğiniz yinelenen işleme davranışına göre seçilmelidir. INSERT IGNORE komutu, çoğaltılan kayıtların ilk kümesini saklar ve kalanları atar. REPLACE komutu, son kopya kümesini saklar ve daha öncekileri siler.
Benzersizliği sağlamanın bir başka yolu da UNIQUE bir tabloya PRIMARY KEY yerine dizin.
CREATE TABLE person_tbl (
first_name CHAR(20) NOT NULL,
last_name CHAR(20) NOT NULL,
sex CHAR(10)
UNIQUE (last_name, first_name)
);
Yinelemeleri Sayma ve Tanımlama
Aşağıda, bir tablodaki ad ve soyad ile yinelenen kayıtları sayma sorgusu yer almaktadır.
mysql> SELECT COUNT(*) as repetitions, last_name, first_name
-> FROM person_tbl
-> GROUP BY last_name, first_name
-> HAVING repetitions > 1;
Bu sorgu person_tbl tablosundaki tüm yinelenen kayıtların bir listesini döndürecektir. Genel olarak, yinelenen değer kümelerini belirlemek için aşağıda verilen adımları izleyin.
Hangi sütunların yinelenebilecek değerleri içerdiğini belirleyin.
Sütun seçim listesinde bu sütunları, COUNT(*).
İçindeki sütunları listeleyin GROUP BY cümle de.
Ekle HAVING Grup sayılarının birden fazla olmasını gerektirerek benzersiz değerleri ortadan kaldıran yan tümce.
Yinelemeleri Sorgu Sonucundan Kaldırma
Kullanabilirsiniz DISTINCT Tabloda bulunan benzersiz kayıtları bulmak için SELECT deyimiyle birlikte komut verin.
mysql> SELECT DISTINCT last_name, first_name
-> FROM person_tbl
-> ORDER BY last_name;
DISTINCT komutunun bir alternatifi, seçtiğiniz sütunları adlandıran bir GROUP BY cümlesi eklemektir. Bu, yinelenenleri kaldırma ve yalnızca belirtilen sütunlardaki benzersiz değer kombinasyonlarını seçme etkisine sahiptir.
mysql> SELECT last_name, first_name
-> FROM person_tbl
-> GROUP BY (last_name, first_name);
Masa Değiştirmeyi Kullanarak Yinelenenleri Kaldırma
Bir tabloda yinelenen kayıtlarınız varsa ve bu tablodan tüm yinelenen kayıtları kaldırmak istiyorsanız, aşağıda verilen prosedürü izleyin.
mysql> CREATE TABLE tmp SELECT last_name, first_name, sex
-> FROM person_tbl;
-> GROUP BY (last_name, first_name);
mysql> DROP TABLE person_tbl;
mysql> ALTER TABLE tmp RENAME TO person_tbl;
Bir tablodan yinelenen kayıtları kaldırmanın kolay bir yolu, bu tabloya bir INDEX veya PRIMARY KEY eklemektir. Bu tablo zaten mevcut olsa bile, yinelenen kayıtları kaldırmak için bu tekniği kullanabilirsiniz ve gelecekte de güvende olacaksınız.
mysql> ALTER IGNORE TABLE person_tbl
-> ADD PRIMARY KEY (last_name, first_name);