การตรวจสอบข้อ จำกัด การตรวจสอบคืออะไร


18

ฉันมี T-SQL ที่สร้างขึ้นอัตโนมัติซึ่งน่าจะถูกต้อง แต่ฉันไม่เข้าใจจริงๆ

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

ฉันรู้ว่าข้อ จำกัด ของคีย์ต่างประเทศคืออะไร แต่คือCHECK CHECKอะไร

คำตอบ:


28

หน้าเอกสารเกี่ยวกับ MSDN ALTER TABLEอธิบายเกี่ยวกับสิ่งเหล่านี้:

  • ALTER TABLE: แก้ไขโครงสร้างของตาราง
    (และการกระทำ / การแก้ไขที่เป็นไปได้บางอย่าง):
    • CHECK CONSTRAINT ..: เปิดใช้งานข้อ จำกัด
    • NOCHECK CONSTRAINT ..: ปิดการใช้งานข้อ จำกัด
      นอกจากนี้ยังมีขั้นตอนเพิ่มเติมที่ต้องทำขณะสร้าง / เปิด / ปิดการใช้งานข้อ จำกัด :
      • WITH CHECK: ตรวจสอบข้อ จำกัด เช่นกัน
      • WITH NOCHECK: อย่าตรวจสอบข้อ จำกัด

ในคำพูดของพวกเขา:

| [ WITH { CHECK | NOCHECK } ] { CHECK | NOCHECK } CONSTRAINT   
    { ALL | constraint_name [ ,...n ] }

...

WITH CHECK | WITH NOCHECK ระบุว่าข้อมูลในตารางเป็นหรือไม่ได้รับการตรวจสอบกับเพิ่มขึ้นใหม่อีกครั้งหรือเปิดการใช้งานFOREIGN KEYหรือCHECKข้อ จำกัด หากไม่ได้ระบุWITH CHECKจะถูกสันนิษฐานว่าเป็นข้อ จำกัด ใหม่และWITH NOCHECKจะถือว่าเป็นข้อ จำกัด ที่เปิดใช้งานอีกครั้ง

หากคุณไม่ต้องการที่จะตรวจสอบใหม่CHECKหรือFOREIGN KEYข้อ จำกัด WITH NOCHECKกับข้อมูลที่มีอยู่ใช้งาน เราไม่แนะนำให้ทำเช่นนี้ยกเว้นในบางกรณี ข้อ จำกัด ใหม่จะถูกประเมินในการอัพเดทข้อมูลในภายหลังทั้งหมด การละเมิดข้อ จำกัด ใด ๆ ที่ถูกระงับโดยWITH NOCHECKเมื่อมีการเพิ่มข้อ จำกัด อาจทำให้การอัปเดตในอนาคตล้มเหลวหากพวกเขาอัปเดตแถวด้วยข้อมูลที่ไม่สอดคล้องกับข้อ จำกัด

เพิ่มประสิทธิภาพแบบสอบถามจะไม่พิจารณาข้อ จำกัด WITH NOCHECKที่มีการกำหนด ข้อ จำกัด ดังกล่าวจะถูกละเว้นจนกว่าพวกเขาจะเปิดใช้งานอีกครั้งโดยใช้ตารางALTER TABLEWITH CHECK CHECK CONSTRAINT ALL

...

{ CHECK | NOCHECK } CONSTRAINT
ระบุว่า constraint_name เปิดใช้งานหรือปิดใช้งาน ตัวเลือกนี้สามารถใช้ได้กับFOREIGN KEYและCHECKข้อ จำกัด เท่านั้น เมื่อNOCHECKมีการระบุข้อ จำกัด จะถูกปิดใช้งานและการแทรกหรือการปรับปรุงในอนาคตของคอลัมน์จะไม่ได้รับการตรวจสอบกับเงื่อนไขข้อ จำกัด DEFAULT, PRIMARY KEYและUNIQUEข้อ จำกัด ไม่สามารถปิดใช้งานได้

ทดสอบในdbfiddle :

CREATE TABLE a (aid INT PRIMARY KEY);

ไป

INSERT INTO a (aid)
VALUES (1), (2), (3) ;

ไป

รับผลกระทบ 3 แถว
CREATE TABLE b 
( aid INT,
  bid INT PRIMARY KEY,
  CONSTRAINT [My_FORIEGN_KEY]
    FOREIGN KEY (aid) REFERENCES a (aid)
) ;

ไป

INSERT INTO b (aid, bid)
VALUES
  (1, 11),
  (1, 12),
  (2, 21), 
  (3, 31) ;

ไป

ได้รับผลกระทบ 4 แถว
INSERT INTO b (aid, bid)
VALUES
  (6, 61),
  (6, 62) ;

ไป

ข่าวสารเกี่ยวกับ 547 ระดับ 16 สถานะ 0 บรรทัด 1
คำสั่ง INSERT ขัดแย้งกับข้อ จำกัด ของ FOREIGN KEY "My_FORIEGN_KEY" ความขัดแย้งเกิดขึ้นในฐานข้อมูล "fiddle_792fce5de09f42908c3a0f91421f3522", ตาราง "dbo.a", คอลัมน์ 'ความช่วยเหลือ'
ข่าวสารเกี่ยวกับ 3621 ระดับ 0 สถานะ 0 บรรทัด 1
คำสั่งถูกยกเลิก
SELECT * FROM b ;

ไป

ช่วยเหลือ | สั่ง
-: | -:
  1 | 11
  1 | 12
  2 | 21
  3 | วันที่ 31
ALTER TABLE b NOCHECK CONSTRAINT [My_FORIEGN_KEY];   --disable

ไป

INSERT INTO b (aid, bid)
VALUES
  (4, 41),
  (4, 42) ;

ไป

รับผลกระทบ 2 แถว
SELECT * FROM b ;

ไป

ช่วยเหลือ | สั่ง
-: | -:
  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

ไป

SELECT * FROM b ;

ไป

ช่วยเหลือ | สั่ง
-: | -:
  1 | 11
  1 | 12
  2 | 21
  3 | วันที่ 31
  4 | 41
  4 | 42
INSERT INTO b (aid, bid)
VALUES
  (6, 61),
  (6, 62) ;

ไป

ข่าวสารเกี่ยวกับ 547 ระดับ 16 สถานะ 0 บรรทัด 1
คำสั่ง INSERT ขัดแย้งกับข้อ จำกัด ของ FOREIGN KEY "My_FORIEGN_KEY" ความขัดแย้งเกิดขึ้นในฐานข้อมูล "fiddle_792fce5de09f42908c3a0f91421f3522", ตาราง "dbo.a", คอลัมน์ 'ความช่วยเหลือ'
ข่าวสารเกี่ยวกับ 3621 ระดับ 0 สถานะ 0 บรรทัด 1
คำสั่งถูกยกเลิก
SELECT * FROM b ;

ไป

ช่วยเหลือ | สั่ง
-: | -:
  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 

ไป

ข่าวสารเกี่ยวกับ 547 ระดับ 16 สถานะ 0 บรรทัด 1
คำสั่ง ALTER TABLE ขัดแย้งกับข้อ จำกัด ของ FOREIGN KEY "My_FORIEGN_KEY" ความขัดแย้งเกิดขึ้นในฐานข้อมูล "fiddle_792fce5de09f42908c3a0f91421f3522", ตาราง "dbo.a", คอลัมน์ 'ความช่วยเหลือ'

1
ขอบคุณ Wrt ALTER TABLE b WITH NOCHECK CHECK CONSTRAINT [My_FORIEGN_KEY]; -- enable constraint without checkingหมายความว่าข้อ จำกัด จะไม่ตรวจสอบข้อมูลที่มีอยู่เฉพาะข้อมูลขาเข้าใหม่หรือไม่
BanksySan

1
เผง ดูว่าไม่อนุญาตการแทรกครั้งต่อไป (ความช่วยเหลือ = 6) แต่แถวที่มีอยู่ (ด้วยความช่วยเหลือ = 4) ยังคงอยู่ที่นั่น
ypercubeᵀᴹ

นั่นแสดงให้เห็นอย่างสมบูรณ์แบบ
BanksySan

1

ลองอ่านบทความได้ที่นี่: https://msdn.microsoft.com/en-us/library/ms190273.aspx

มันบอกเราว่า: 'เครื่องมือเพิ่มประสิทธิภาพข้อความค้นหาไม่พิจารณาข้อ จำกัด ที่กำหนดไว้ด้วย NOCHECK ข้อ จำกัด ดังกล่าวจะถูกเพิกเฉยจนกว่าพวกเขาจะเปิดใช้งานอีกครั้งโดยใช้ตาราง ALTER TABLE พร้อม CHECK CHECK CONSTRAINT ALL '

และพิจารณาเธรดนี้บน StackOverflow: /programming/529941/with-check-add-constraint-followed-by-check-constraint-vs-add-constraint

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.