แก้ไขตารางตรวจสอบข้อ จำกัด


25

จาก Object Explorer ใน SQL Server เมื่อเลือกและเขียนสคริปต์ข้อ จำกัด foreign-key รหัสต่อไปนี้จะถูกสร้างขึ้น

     USE [MyTestDatabase]
     GO

     ALTER TABLE [dbo].[T2] WITH NOCHECK ADD CONSTRAINT [FK_T2_T1] FOREIGN KEY([T1ID])
     REFERENCES [dbo].[T1] ([T1ID])
     GO

     ALTER TABLE [dbo].[T2] CHECK CONSTRAINT [FK_T2_T1]
     GO

อะไรคือวัตถุประสงค์ของคำแถลงล่าสุด "การเปลี่ยนแปลงตารางตรวจสอบข้อ จำกัด "? ดูเหมือนจะไม่สำคัญว่าจะรันหรือไม่ จะไม่ล้มเหลวกับข้อมูลที่ไม่ดีที่มีอยู่และไม่เปลี่ยนแปลงว่าข้อ จำกัด จะถูกบังคับใช้กับข้อมูลใหม่

ขอบคุณ!

คำตอบ:


23

ช่วยให้มั่นใจว่าข้อ จำกัด นั้นเปิดใช้งานหลังจากที่สร้าง ALTER TABLEคำสั่งของคุณรวมถึงWITH NOCHECKชิ้นส่วนที่ระบุว่าไม่ให้ตรวจสอบข้อมูลที่ไม่ดีที่มีอยู่ในระหว่างการสร้างข้อ จำกัด

ตามที่เขียนไว้ข้อมูลที่มีอยู่จะไม่ถูกตรวจสอบกับข้อ จำกัด เนื่องจากWITH NOCHECKในคำสั่งแรก การออกคำสั่งที่สองจะช่วยให้การตรวจสอบกับข้อ จำกัด สำหรับการเปลี่ยนแปลงในอนาคตใด ๆ ในตารางที่ครอบคลุมโดยข้อ จำกัด จนถึงจุดที่มีการALTER TABLE [dbo].[T2] NOCHECK CONSTRAINT [FK_T2_T1]ออก

ข้อความดังกล่าวเขียนโดยทั่วไปแล้วว่า "สร้างข้อ จำกัด กุญแจต่างประเทศนี้ แต่อย่าตรวจสอบกับข้อมูลที่มีอยู่ทำให้เป็นสถานะใช้งานสำหรับการเปลี่ยนแปลงใด ๆ ที่จะเกิดขึ้นกับข้อมูล"


จริง ๆ แล้วฉันตรวจสอบว่ามันไม่ได้สร้างความแตกต่างถ้ามีข้อมูลไม่ดีบรรทัดแรกหรือบรรทัดที่สองจะไม่ล้มเหลว เพื่อให้มีความล้มเหลวพวกเขาจะต้องมีลักษณะเช่นนี้:
Delux

2
แก้ไขตาราง [dbo]. [T2] ด้วยการตรวจสอบการตรวจสอบข้อ จำกัด [FK_T2_T1]
Delux

ขวา. แต่คุณจะเห็นว่ามันล้มเหลวหลังจากนั้นเมื่อถึงจุดหนึ่งคุณพยายามเรียกใช้ INSERT หรือ UPDATE ที่ละเมิดข้อ จำกัด ทั้งสองจะไม่ล้มเหลวหากข้อมูลที่ไม่ดีอยู่ในเวลาที่คำสั่งเหล่านั้น 2 จะถูกดำเนินการ
squillman

7

คำสั่งแรกของคุณสร้างข้อ จำกัด ที่ปิดใช้งาน จำเป็นต้องเปิดใช้งานและอาจเชื่อถือได้ ไวยากรณ์แปลก ๆ ต่อไปนี้จะทำให้แน่ใจว่าข้อ จำกัด ของคุณถูกเปิดใช้งานและเชื่อถือได้:

ALTER TABLE YourTable
      WITH CHECK CHECK CONSTRAINT YourConstraint;

มีการโพสต์บล็อกที่ดีมากโดย Hugo Kornelis ที่อธิบายในรายละเอียดดี: คุณสามารถเชื่อถือข้อ จำกัด ของคุณ

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