Veritabanında kayıt silmek için delete ifadesi kullanılır.
Kullanımı
1 2 3 |
Delete from tablo_adi [where şartlar] |
Where şartlar kısmının köşeli parantezler arasına alınmasının sebebi isteğe bağlı olmasıdır. Genellikle bir şart ile beraber kullanılır. Şart yazılmadığında tablo_adi kısmında belirtiğiniz tablonun tüm kayıtlarını siler. Bazen tablonun tüm kayıtlarını da silmek isteyebilirsiniz. O zaman belirtiğimiz gibi şart yazılmaz veya truncate ifadesi kullanılır.
Şimdi delete ifadesi ile ilgili aşağıda kütüphane veritabanını kullanarak örnekler yazalım.
Örnek 1: 50 Numaralı öğrenciyi siliniz.
1 2 3 |
Delete from ogrenci where ogrno = 50 |
Yukarıdaki kod yazılırken en çok yapılan hata delete ifadesinden sonra * kullanılmasıdır. Select komutlarında çokça kullanılan * ifadesi delete komutunda yoktur. Yani aşağıdaki kod hatalıdır.
Delete * from ogrenci where ogrno = 50
Bazen de silme işleminde aşağıdaki hataya benzer bir hata alabilirsiniz.
The DELETE statement conflicted with the REFERENCE constraint “FK_islem_ogrenci”. The conflict occurred in database “kutuphane”, table “dbo.islem”, column ‘ogrno’.
Bu hata ogrenci tablosu işlem tablosu ile ilişkili olduğu için karşımıza gelmektedir. 50 numaralı öğrenci silindiğinde bilgi tutarlılığı bozulur. Bilgi tutarlılığı bozulmaması için önce işlem tablosundan 50 numaralı öğrencinin tüm kayıtlarını silmek gerekir. Bu hata gelmemesi için başka bir yöntemde ilişki kurulurken ilişki ayarlarından Cascade seçilmesidir. Eğer Cascade seçilirse 50 numaralı öğrenci silindiğinde o öğrencinin işlemleri de otomatik olarak silinir ve bilgi tutarlılığı korunmuş olur.
Örnek 2: Yazarlar tablosundaki tüm yazarları siliniz.
1 2 3 |
Delete from yazarlar |
Daha öncede belirttiğimiz gibi tüm kayıtları silmek için şart yazılmaz yada aşağıdaki truncate ifadesi kullanılır.
1 2 3 |
Truncate table yazarlar |
Truncate ifadesinin delete ifadesinden farkı tabloyu oluşturulduğu ilk halinde çevirir. Tablomuzda otomatik artan alan varsa ve silme işlemini delete ifadesi ile yaparsak otomatik artan alan kaldığı yerden devam eder ama silme işlemini truncate komutu ile yaparsak otomatik artan özelliğindeki alan sayma işlemine baştan başlar.
Örnek 3: 10A sınıfının erkek öğrencilerinin siliniz.
1 2 3 |
Delete from ogrenci where sinif='10A' and Cinsiyet ='E' |
Not: Bizim kullandığımız veritabanında cinsiyet alanı erkek için E, kız için K şeklinde kısaltılarak kaydedildiği için yukarıdaki kodda kısaltılarak yazılmıştır.
Delete ifadesinin şart kısmında bir select ifadesinde yazılabilen tüm şartlar kullanılabilir. Bunun için select komutunun kullanımı başlıklı yazımızı inceleyebilirsiniz.
Bir select ifadesinde iki veya daha fazla tablo birleştirilip gösterilebilirken, silme sorguları tek tablo ile çalışır. Yani aynı anda birden fazla tablodan silme işlemini gerçekleştiremezsiniz. Şartımız başka bir tabloda ama tek bir tablodan silme işlemi gerçekleştireceksek bunun için alt sorgular kullanabiliriz. Aşağıdaki örnek buna benzer bir yapıdadır.
Örnek 4: Sayfasayısı 100’den az olan kitapların yazarlarını siliniz.
1 2 3 |
Delete from yazarlar where yazarno in (Select yazarno from kitap where sayfasayisi <100) |
Yukarıdaki sorguda alt sorgu sayfa sayısı 100 den az olan kitapların yazar numaralarını bize getiriyor. Delete ifadeside bu yazarları silmemizi sağlıyor. Yukarıdaki sorguyu daha iyi anlayabilmek için in ifadesinin kullanımını ve iç içe select ifadesinin kullanımını inceleyebilirsiniz.
Merhaba. Yazınızda 50 No’lu öğrenciyi silmeyi göstermişsiniz ama ben bir şeyi merak ediyorum. Dışarıdan aldığım değere göre nasıl silme işlemi yapabilirim. Yani ben bu 50 değerini kullanıcıdan almak istiyorum. Bazı yerlerde araştırma yaptım ama bir cevaba ulaşamadım. Cevap verirseniz sevinirim.