ฉันมี 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 TABLE
WITH 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
หมายความว่าข้อ จำกัด จะไม่ตรวจสอบข้อมูลที่มีอยู่เฉพาะข้อมูลขาเข้าใหม่หรือไม่