WITH CHECK ADD CONSTRAINT followed by CHECK CONSTRAINT vs. ADD CONSTRAINT

后端 未结 7 1048
天涯浪人
天涯浪人 2020-12-02 06:06

I\'m looking at the AdventureWorks sample database for SQL Server 2008, and I see in their creation scripts that they tend to use the following:

ALTER TABLE          


        
7条回答
  •  悲&欢浪女
    2020-12-02 06:59

    To demonstrate how this works--

    CREATE TABLE T1 (ID INT NOT NULL, SomeVal CHAR(1));
    ALTER TABLE T1 ADD CONSTRAINT [PK_ID] PRIMARY KEY CLUSTERED (ID);
    
    CREATE TABLE T2 (FKID INT, SomeOtherVal CHAR(2));
    
    INSERT T1 (ID, SomeVal) SELECT 1, 'A';
    INSERT T1 (ID, SomeVal) SELECT 2, 'B';
    
    INSERT T2 (FKID, SomeOtherVal) SELECT 1, 'A1';
    INSERT T2 (FKID, SomeOtherVal) SELECT 1, 'A2';
    INSERT T2 (FKID, SomeOtherVal) SELECT 2, 'B1';
    INSERT T2 (FKID, SomeOtherVal) SELECT 2, 'B2';
    INSERT T2 (FKID, SomeOtherVal) SELECT 3, 'C1';  --orphan
    INSERT T2 (FKID, SomeOtherVal) SELECT 3, 'C2';  --orphan
    
    --Add the FK CONSTRAINT will fail because of existing orphaned records
    ALTER TABLE T2 ADD CONSTRAINT FK_T2_T1 FOREIGN KEY (FKID) REFERENCES T1 (ID);   --fails
    
    --Same as ADD above, but explicitly states the intent to CHECK the FK values before creating the CONSTRAINT
    ALTER TABLE T2 WITH CHECK ADD CONSTRAINT FK_T2_T1 FOREIGN KEY (FKID) REFERENCES T1 (ID);    --fails
    
    --Add the CONSTRAINT without checking existing values
    ALTER TABLE T2 WITH NOCHECK ADD CONSTRAINT FK_T2_T1 FOREIGN KEY (FKID) REFERENCES T1 (ID);  --succeeds
    ALTER TABLE T2 CHECK CONSTRAINT FK_T2_T1;   --succeeds since the CONSTRAINT is attributed as NOCHECK
    
    --Attempt to enable CONSTRAINT fails due to orphans
    ALTER TABLE T2 WITH CHECK CHECK CONSTRAINT FK_T2_T1;    --fails
    
    --Remove orphans
    DELETE FROM T2 WHERE FKID NOT IN (SELECT ID FROM T1);
    
    --Enabling the CONSTRAINT succeeds
    ALTER TABLE T2 WITH CHECK CHECK CONSTRAINT FK_T2_T1;    --succeeds; orphans removed
    
    --Clean up
    DROP TABLE T2;
    DROP TABLE T1;
    

提交回复
热议问题