Yanıtlar:
Hakkındaki MSDN dokümantasyon sayfasında ALTER TABLE
şunlar açıklanmaktadır:
ALTER TABLE
: tablonun yapısını değiştirin CHECK CONSTRAINT ..
: kısıtlamayı etkinleştirNOCHECK CONSTRAINT ..
: kısıtlamayı devre dışı bırak WITH CHECK
: kısıtlamayı da kontrol edinWITH NOCHECK
: kısıtlamayı kontrol etmeOnların sözleriyle:
| [ WITH { CHECK | NOCHECK } ] { CHECK | NOCHECK } CONSTRAINT { ALL | constraint_name [ ,...n ] }
...
WITH CHECK | WITH NOCHECK
Olmadığını belirtir tablodaki verilerin veya geçerliliği karşı yeni eklenmiş veya yeniden etkinleştirilmişFOREIGN KEY
veyaCHECK
kısıtlama . Belirtilmezse,WITH CHECK
yeni kısıtlamalarWITH NOCHECK
için varsayılır ve yeniden etkinleştirilen kısıtlamalar için varsayılır.Mevcut verilere karşı yeni
CHECK
veyaFOREIGN KEY
kısıtlamaları doğrulamak istemiyorsanız kullanınWITH NOCHECK
. Nadir durumlar dışında bunu yapmanızı önermiyoruz. Yeni kısıtlama, daha sonraki tüm veri güncellemelerinde değerlendirilecektir. KısıtlamaWITH NOCHECK
eklendiğinde bastırılan herhangi bir kısıtlama ihlali, satırları kısıtlamaya uymayan verilerle güncelleştirmeleri durumunda gelecekteki güncelleştirmelerin başarısız olmasına neden olabilir.Sorgu iyileştirici, tanımlanan kısıtlamaları dikkate almaz
WITH NOCHECK
. Bu kısıtlamalarALTER TABLE
tablo kullanılarak yeniden etkinleştirilene kadar yok sayılırWITH CHECK CHECK CONSTRAINT ALL
....
{ CHECK | NOCHECK } CONSTRAINT
Kısıt_adı'nın etkinleştirildiğini veya devre dışı bırakıldığını belirtir. Bu seçenek yalnızcaFOREIGN KEY
veCHECK
kısıtlamalarıyla kullanılabilir . Ne zamanNOCHECK
belirtilmişse, kısıt devre dışıdır ve kolona gelecek ekler veya güncellemeleri kısıtlama koşullarına karşı valide edilmemiştir.DEFAULT
,,PRIMARY KEY
veUNIQUE
kısıtlamalar devre dışı bırakılamaz.
Dbfiddle'da test edin :
CREATE TABLE a (aid INT PRIMARY KEY);
GİT
✓
INSERT INTO a (aid) VALUES (1), (2), (3) ;
GİT
Etkilenen 3 satır
CREATE TABLE b ( aid INT, bid INT PRIMARY KEY, CONSTRAINT [My_FORIEGN_KEY] FOREIGN KEY (aid) REFERENCES a (aid) ) ;
GİT
✓
INSERT INTO b (aid, bid) VALUES (1, 11), (1, 12), (2, 21), (3, 31) ;
GİT
4 satır etkilenir
INSERT INTO b (aid, bid) VALUES (6, 61), (6, 62) ;
GİT
Msg 547 Seviye 16 Durum 0 Hat 1 INSERT ifadesi, FOREIGN KEY kısıtlaması "My_FORIEGN_KEY" ile çakıştı. Çakışma "fiddle_792fce5de09f42908c3a0f91421f3522" veritabanında, "dbo.a" tablosunda, "yardım" sütununda oluştu. Msg 3621 Seviye 0 Durum 0 Hat 1 Açıklama sona erdirildi.
SELECT * FROM b ;
GİT
yardım | teklif -: | -: 1 | 11 1 | 12 2 | 21 3 | 31
ALTER TABLE b NOCHECK CONSTRAINT [My_FORIEGN_KEY]; --disable
GİT
✓
INSERT INTO b (aid, bid) VALUES (4, 41), (4, 42) ;
GİT
2 satır etkilenir
SELECT * FROM b ;
GİT
yardım | teklif -: | -: 1 | 11 1 | 12 2 | 21 3 | 31 4 | 41 4 | 42
ALTER TABLE b WITH NOCHECK CHECK CONSTRAINT [My_FORIEGN_KEY]; -- enable constraint without checking existing data
GİT
✓
SELECT * FROM b ;
GİT
yardım | teklif -: | -: 1 | 11 1 | 12 2 | 21 3 | 31 4 | 41 4 | 42
INSERT INTO b (aid, bid) VALUES (6, 61), (6, 62) ;
GİT
Msg 547 Seviye 16 Durum 0 Hat 1 INSERT ifadesi, FOREIGN KEY kısıtlaması "My_FORIEGN_KEY" ile çakıştı. Çakışma "fiddle_792fce5de09f42908c3a0f91421f3522" veritabanında, "dbo.a" tablosunda, "yardım" sütununda oluştu. Msg 3621 Seviye 0 Durum 0 Hat 1 Açıklama sona erdirildi.
SELECT * FROM b ;
GİT
yardım | teklif -: | -: 1 | 11 1 | 12 2 | 21 3 | 31 4 | 41 4 | 42
ALTER TABLE b WITH CHECK CHECK CONSTRAINT [My_FORIEGN_KEY]; -- check existing data and enable constraint
GİT
Msg 547 Seviye 16 Durum 0 Hat 1 ALTER TABLE deyimi "My_FORIEGN_KEY" FOREIGN KEY kısıtlamasıyla çakıştı. Çakışma "fiddle_792fce5de09f42908c3a0f91421f3522" veritabanında, "dbo.a" tablosunda, "yardım" sütununda oluştu.
Makaleyi burada okuyun: https://msdn.microsoft.com/en-us/library/ms190273.aspx
Bize şunu söyler: 'Sorgu iyileştirici NOCHECK İLE tanımlanan kısıtlamaları dikkate almaz. Bu kısıtlamalar, CHECK CHECK CONSTRAINT ALL ile ALTER TABLE tablosu kullanılarak yeniden etkinleştirilene kadar yok sayılır '
Ayrıca StackOverflow'daki iş parçacığını düşünün: /programming/529941/with-check-add-constraint-followed-by-check-constraint-vs-add-constraint
ALTER TABLE b WITH NOCHECK CHECK CONSTRAINT [My_FORIEGN_KEY]; -- enable constraint without checking
, bu kısıtlamanın mevcut verileri kontrol etmeyeceği anlamına mı geliyor, sadece yeni gelen verileri mi?