MySQL tablosundan tekrarlı kayıtların nasıl silineceği hakkında bilgi vereceğim. Tekrarlı kayıtları silmek disk alanından kazanmayı ve sorguların daha hızlı çalışmasını sağlar.
1. Yöntem
Bu yöntemde tekrarsız kayıtlar sorgulanarak yedek bir tabloya aktarılır, daha sonra ana tablo silinerek yadek tablonun adı ana tablo ile aynı yapılır. Öncelikle ana tablodan (tablo1) distinct kelimesi ile benzersiz kayıtlar listelenir. Distinct ifadesi tekrar eden kayıtları listelemez sadece birbirinden farklı kayıtlar getirilir. Geelen kayıtlar yeni bir tabloya kaydedilerek eski ktablo silinir. Sonuçta tekrarlı kayıtların ayıklandığı bir tablo elde edilmiş olur. Bu şöyle yapıyoruz:
1 |
[crayon-673e2161c87d2880369652 lang="sql" ]CREATE TABLE yeni_tablo as SELECT * FROM eski_tablo WHERE 1 GROUP BY alan_adi1 |
Bu örnekte alan_adi1 isimli alana göre tekrarlı kayıtlar guruplanarak tek kayıda indirgeniyor ve dönen sonuçdan yeni_tablo isminde bir tablo oluşturuluyor. Tekrarlanan satırları tanımlamak için birden fazla alan da kullanılabilir.
1 |
[crayon-673e2161c87d7394081696 lang="sql" ]CREATE TABLE yeni_tablo as SELECT * FROM eski_tablo WHERE 1 GROUP BY alan_adi1, alan_adi2, alan_adi3... |
2. Yöntem
Bu kodu benim için oluşturan Emin Kadıoğlu dostuma teşekkür ederek kodu vermek istiyorum.
1 |
[crayon-673e2161c87dc024872159 lang="sql" ]delete from ayrinti_tablo1 where a1no in <br/>(select a1no from (select b.a1no from ayrinti_tablo1 b where b.a1no not in <br/>(select c.a1no from ayrinti_tablo1 c group by c.atno)) as deneme); |
SQL kodunu denemek için aşağıdaki veri yapısını kullanarabilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
[crayon-673e2161c87e0384190370 lang="sql" ]/* MySQL Data Transfer Source Host: localhost Source Database: deneme Target Host: localhost Target Database: deneme Date: 07.08.2008 18:05:56 */ SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for ayrinti_tablo1 -- ---------------------------- CREATE TABLE `ayrinti_tablo1` ( `a1no` int(11) NOT NULL auto_increment, `atno` int(11) default NULL, `bilgi1` varchar(100) default NULL, `bilgi2` varchar(100) default NULL, PRIMARY KEY (`a1no`) ) ENGINE=MyISAM DEFAULT CHARSET=latin5; -- ---------------------------- -- Records -- ---------------------------- INSERT INTO `ayrinti_tablo1` VALUES ('23', '2', 'tret', null); INSERT INTO `ayrinti_tablo1` VALUES ('27', '2', 'wqe', null); INSERT INTO `ayrinti_tablo1` VALUES ('28', '3', 'wqe', null); INSERT INTO `ayrinti_tablo1` VALUES ('29', '3', 'wqe', null); INSERT INTO `ayrinti_tablo1` VALUES ('22', '3', 're', null); INSERT INTO `ayrinti_tablo1` VALUES ('31', '2', 'wqe', null); INSERT INTO `ayrinti_tablo1` VALUES ('26', '2', 'qwe', null); INSERT INTO `ayrinti_tablo1` VALUES ('30', '2', 'wqe', null); INSERT INTO `ayrinti_tablo1` VALUES ('25', '4', 'wqe', null); INSERT INTO `ayrinti_tablo1` VALUES ('32', '3', 'wqe', null); INSERT INTO `ayrinti_tablo1` VALUES ('33', '2', 'wq', null); |
Birçok yeri aradım şöyle güzel açıklayan olmamış. Birinci yöntem yarayışlı oldu.
Teşekkürler.
Çok işime yaradı hocam teşekkür ederim !