Tekrarlı kayıtları silme

MySQL tablonuzda bulunan tekrarlı kayıtları nasıl silersiniz?

Geçenlerde, hazırladığım bir projede MySQL tablosundaki tekrarlı kayıtları temizlemem gerekti.

Bunun için kısacık bir araştırmadan sonra güzel bir çözüm buldum ve sizlerle paylaşmak istedim.

4 basit adımda tekrarlı (mükerrer) kayıtları temizleme:

1. Geçici bir tabloya tekrarsız kayıtları atarız.

CREATE TABLE gecici_table as
SELECT * FROM tablonuz GROUP BY <<ALAN ADI>>;

Alan adı yerine hangi alana göre gruplamak istediğimizi yazıyoruz. (Id ise Id, Başlık ise Baslik gibi...)

2. Eski tablonuzu silin.

3. Oluşturduğumuz yeni tablonun adını, eski tablomuzun adı ile değiştiriyoruz.

4. Primary Key ve diğer index alanlarını tekrar oluşturuyoruz.

Şimdi örnek üzerinden gidelim.

Tablomuz:

Id (PK) Baslik Diğer
1 A XXX
2 A AAA
3 B WWW
4 C BBB
5 C FFF
6 D QQQ

şeklinde olsun.

İpucu: PK -> Primary Key

Başlık alanlarına göre tekrarlı kayıtları silmek istiyorum.

O zaman SQL imiz:

CREATE TABLE gecici_table as
SELECT * FROM Haberler GROUP BY Baslik

şeklinde olmalıdır.

Bu adımdan sonra tablomuz:

Id Baslik Diğer
1 A XXX
3 B WWW
4 C BBB
6 D QQQ

Dikkat: Id alanı artık Primary Key değil.

2. adımda, eski tablomuzu siliyoruz.

DROP TABLE haberler;

3. yeni tablonun adını değiştiriyoruz.

RENAME TABLE haberler TO gecici_table;

4. Yeni tablomuzdaki Id alanını otomatik artan yapıp, Primary Key yapıyoruz:

ALTER TABLE `haberler`
CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT FIRST;
 
ALTER TABLE `haberler`
ADD UNIQUE INDEX `Id` (`Id`);

İşte bu kadar, geçmiş olsun. :)

Notlar:

  1. MySQL ile çalıştığım için bu kodların SQL SERVER karşılıklarını bulmak için uğraşmadım. :)
  2. Daha kısa yollar da var diyebilirsiniz.
ALTER IGNORE TABLE haberler ADD UNIQUE INDEX dupidxxx (Baslik);
ALTER TABLE haberler DROP INDEX dupidxxx;

de olduğu gibi. Ancak alanımız varchar değil de TEXT veya BLOB ise bu satırlar çalışmayacaktır, çünkü MySQL, BLOB/TEXT alanların sadece ilk X karakterine göre indexleme yapabiliyor.

Bu durumda, kayıtlar üzerinde istediğimiz sonucu alamayacağız demektir.