WITH CHECK CHECK CONSTRAINT nedir?


18

Muhtemelen geçerli bazı otomatik oluşturulan T-SQL var, ama gerçekten anlamıyorum.

ALTER TABLE [dbo].[MyTable]
WITH CHECK
CHECK CONSTRAINT [My_FORIEGN_KEY];

Yabancı anahtar kısıtlamasının ne olduğunu biliyorum, ama ne CHECK CHECK?

Yanıtlar:


29

Hakkındaki MSDN dokümantasyon sayfasında ALTER TABLEşunlar açıklanmaktadır:

  • ALTER TABLE: tablonun yapısını değiştirin
    (ve bazı olası eylemler / değişiklikler şunlardır):
    • CHECK CONSTRAINT ..: kısıtlamayı etkinleştir
    • NOCHECK CONSTRAINT ..: kısıtlamayı devre dışı bırak
      Bir kısıtlamayı oluştururken / etkinleştirirken / devre dışı bırakırken yapılacak ek, isteğe bağlı adımlar da vardır:
      • WITH CHECK: kısıtlamayı da kontrol edin
      • WITH NOCHECK: kısıtlamayı kontrol etme

Onları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 KEYveya CHECKkısıtlama . Belirtilmezse, WITH CHECKyeni kısıtlamalar WITH NOCHECKiçin varsayılır ve yeniden etkinleştirilen kısıtlamalar için varsayılır.

Mevcut verilere karşı yeni CHECKveya FOREIGN KEYkısıtlamaları doğrulamak istemiyorsanız kullanın WITH NOCHECK. Nadir durumlar dışında bunu yapmanızı önermiyoruz. Yeni kısıtlama, daha sonraki tüm veri güncellemelerinde değerlendirilecektir. Kısıtlama WITH 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ıtlamalar ALTER TABLEtablo kullanılarak yeniden etkinleştirilene kadar yok sayılır WITH 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ızca FOREIGN KEYve CHECKkısıtlamalarıyla kullanılabilir . Ne zaman NOCHECKbelirtilmiş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 KEYve UNIQUEkı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.

1
Teşekkürler. Wrt 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?
BanksySan

1
Kesinlikle. Bir sonraki eklemeye (aid = 6) nasıl izin verilmediğini, ancak mevcut satırların (aid = 4 ile) hala orada olduğunu görün.
ypercubeᵀᴹ

Bu onu mükemmel bir şekilde gösteriyor.
BanksySan

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.