MS SQL eğitimlerimize bir hata çözümü ile devam ediyoruz.
İlişkili veritabanlarımızda silme işlemi yaparken eğer gerekli kuralları ayarlamadı isek şu hatayı alırız.
Elimde var olan ilişkili veri tabanının bir tablosundan bir veri silmek isteyeyim.
Böyle bir hata alırım.
Msg 547, Level 16, State 0, Line 7
The DELETE statement conflicted with the REFERENCE constraint
"FK_ORDERS_CUSTOMER". The conflict occurred in database "XENONBOX",
table "dbo.ORDER", column 'CUSTOMERID'.
The statement has been terminated.
Yani şunu diyor aslında sizin silmeye çalıştığınız bu kaydın, ORDERS tablosunda CUSTOMERID kolonu ile bir bağlantısı var ve siz bunu sadece buradan silerseniz diğer tabloda kalacak ama sistemde böyle bir kişi yokken kişi varmış gibi ORDERS tablosunda kaydı kalacak bizim veri benzersizliği ilkemize aykırı bu o yüzden bu tablodan bu veriyi silemem diyor. Teknik olarak yazılan cümlenin Türkçesi bu.
Şimdi bu durumdan nasıl kurtuluruz onu düşünelim.
Aklımıza şöyle bir şey gelecektir ki bu bu sistemi kuranlarında aklına gelmiş. Eğer ben CUSTOMER tablosundan bir kişiyi silersem bu kişinin ilişkili olduğu tüm tablolardan ona ait kayıtlarda aynı anda silinmesini sağlamalıyım. Bunu nasıl yapacağımıza bakalım.
STEP 1
Var olan diyagram üzerine sağ tıklayıp MODIFY diyoruz.
STEP 2
STEP 3
Bir biri ile ilişkili olan tablolarda ilişkiler üzerine gelip sağ tıklıyoruz ve Properties diyoruz.
STEP 4
Burada DELETE Rule ve UPDATE Rule sekmelerini No Action durumundan CASCADE durumuna çekiyoruz.
Bu adımı değişikliğin ortak olarak uygulanmasını istediğimiz tüm ilişkiler için tekrarlıyoruz.
STEP 5
Sonra diyagramı kaydediyoruz.
İşte bu kadardı şimdi az önce silmeye çalıştığımız kaydı yeniden silmeye çalışalım.
Şimdi şunu yapacağız.
XENONBOX üzerinde CUSTOMER tablosunda var olan Antonio’nun ORDERS tablosunda kaç kaydının olduğuna bakıyoruz. Sonra Antonio’yu sileceğiz ve ORDERS tablosundaki kayıtları kontrol edeceğiz.
Adım adım gidiyoruz.
SELECT * FROM CUSTOMER
3 | Antonio | Moreno | Münih | Mexico | (5) 555-3932 |
Antonio’nun ID si 3 bu numara ile ORDERS tablosunda bir aratalım.
SELECT * FROM ORDERS WHERE CUSTOMERID = 3
118 | 2012-11-27 00:00:00.000 | 542495 | 40320.00 | 3 |
260 | 2013-04-15 00:00:00.000 | 542637 | 88125.00 | 3 |
288 | 2013-05-13 00:00:00.000 | 542665 | 215650.00 | 3 |
326 | 2013-06-19 00:00:00.000 | 542703 | 208200.00 | 3 |
430 | 2013-09-22 00:00:00.000 | 542807 | 95690.00 | 3 |
435 | 2013-09-25 00:00:00.000 | 542812 | 37550.00 | 3 |
609 | 2014-01-28 00:00:00.000 | 542986 | 66000.00 | 3 |
7 Kaydın olduğunu görüyoruz. Şimdi Antonio’yu silelim.
DELETE FROM CUSTOMER WHERE ID=3
Şimdi bir daha ORDERS tablosunda Antonio’yu çağıralım bakalım gelecek mi?
İşte başarılı bir şekilde ilişkili tablolarımız arasında silme işlemini gerçekleştirmiş olduk.
Bir sonraki yazımda görüşmek üzere.