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-67dbd390d9c87228777182 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-67dbd390d9c89895721781 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-67dbd390d9c8c077041727 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-67dbd390d9c8e720906534 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 !