ฉันมี T-SQL ที่สร้างขึ้นอัตโนมัติซึ่งน่าจะถูกต้อง แต่ฉันไม่เข้าใจจริงๆ
ALTER TABLE [dbo].[MyTable]
WITH CHECK
CHECK CONSTRAINT [My_FORIEGN_KEY];
ฉันรู้ว่าข้อ จำกัด ของคีย์ต่างประเทศคืออะไร แต่คือCHECK CHECKอะไร
ฉันมี T-SQL ที่สร้างขึ้นอัตโนมัติซึ่งน่าจะถูกต้อง แต่ฉันไม่เข้าใจจริงๆ
ALTER TABLE [dbo].[MyTable]
WITH CHECK
CHECK CONSTRAINT [My_FORIEGN_KEY];
ฉันรู้ว่าข้อ จำกัด ของคีย์ต่างประเทศคืออะไร แต่คือCHECK CHECKอะไร
คำตอบ:
หน้าเอกสารเกี่ยวกับ 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", คอลัมน์ 'ความช่วยเหลือ'
ลองอ่านบทความได้ที่นี่: 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
ALTER TABLE b WITH NOCHECK CHECK CONSTRAINT [My_FORIEGN_KEY]; -- enable constraint without checkingหมายความว่าข้อ จำกัด จะไม่ตรวจสอบข้อมูลที่มีอยู่เฉพาะข้อมูลขาเข้าใหม่หรือไม่