ON DELETE CASCADE ve ON UPDATE CASCADE Nedir ve Nasıl Kullanılır
Bu ifadeleri Foreing Key constaint’i ile beraber kullanabiliriz. Öncelikle Foreign Key’in ne olduğunu detaylı bir şekilde anlamak gerekir. “Primary Key ve Foreign Key” isimli makaleden faydalanabilirsiniz.
“Primary Key ve Foreign Key” isimli makalede anlattığım gibi Foreing key tanımladıysanız, normal şartlar altında foreing key’in olduğu tablodaki kaydı silmeden, primary tablodaki kaydı silemezsiniz. Silmek istediğiniz aşağıdaki gibi hata alırsınız.
Msg 547, Level 16, State 0, Line 4
The DELETE statement conflicted with the REFERENCE constraint “FK_sehirozellikleri_Sehir”. The conflict occurred in database “test”, table “dbo.sehirozellikleri”, column ‘SehirID’.
The statement has been terminated.
Ama foreing key’i oluşturuken aşağıdaki gibi sonuna ON DELETE CASCADE koymuş olsaydınız, primary tablodaki kaydı sildiğinizde foreign key’in tanımlı olduğu alt tablodaki kayıtları’da otomatik olarak silerdi. Yukardaki hatayı almazdınız. Tabiki bu her zaman istenen bir davranış değildir. Bu yüzden default olarak bu şekilde bir davranış sergilenmez.
ON DELETE CASCADE ile bir foreign key’i aşağıdaki script’ten faydalanalarak oluşturabilirsiniz.
ALTER TABLE [dbo].[sehirozellikleri] WITH CHECK ADD CONSTRAINT [FK_sehirozellikleri_Sehir] FOREIGN KEY([SehirID]) REFERENCES [dbo].[sehir] ([ID]) ON DELETE CASCADE GO ALTER TABLE [dbo].[sehirozellikleri] CHECK CONSTRAINT [FK_sehirozellikleri_Sehir] GO
ON UPDATE CASCADE‘da primary tablodaki foreing key’in reference olduğu kolon’da bir update olduğu zaman bu update’in foreing key’in olduğu tabloya da yansımasını sağlar. Ya da primary tablodaki kolonun tipi değiştirilmek istenirse bu değişiklik foreign key’in olduğu tabloda da yapılır.
Eğer Foreign Key’i ON UPDATE CASCADE eklentisiyle oluşturmadıysanız primary tabloda, foreing key tarafından reference olunan kolonda bir update yapmak istediğinizde aşağıdakin gibi hata alırsınız.
Msg 547, Level 16, State 0, Line 4
The UPDATE statement conflicted with the REFERENCE constraint “FK_sehirozellikleri_Sehir”. The conflict occurred in database “test”, table “dbo.sehirozellikleri”, column ‘SehirID’.
The statement has been terminated.
Foreing Key’i aşağıdaki şekilde ON UPDATE CASCADE eklentisiyle oluşturabilirsiniz.
ALTER TABLE [dbo].[sehirozellikleri] WITH CHECK ADD CONSTRAINT [FK_sehirozellikleri_Sehir] FOREIGN KEY([SehirID]) REFERENCES [dbo].[sehir] ([ID]) ON UPDATE CASCADE GO ALTER TABLE [dbo].[sehirozellikleri] CHECK CONSTRAINT [FK_sehirozellikleri_Sehir] GO