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 NOCHECKOlmadığını belirtir tablodaki verilerin veya geçerliliği karşı yeni eklenmiş veya yeniden etkinleştirilmişFOREIGN KEYveyaCHECKkısıtlama . Belirtilmezse,WITH CHECKyeni kısıtlamalarWITH NOCHECKiçin varsayılır ve yeniden etkinleştirilen kısıtlamalar için varsayılır.Mevcut verilere karşı yeni
CHECKveyaFOREIGN KEYkı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 NOCHECKeklendiğ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 TABLEtablo 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 KEYveCHECKkısıtlamalarıyla kullanılabilir . Ne zamanNOCHECKbelirtilmiş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 KEYveUNIQUEkı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]; --disableGİ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 dataGİ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 constraintGİ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?