由于外键约束而使用INSERT和UPDATE语句禁用外键约束

时间:2017-05-25 07:28:54

标签: sql sql-server

我在将数据插入数据库时​​获得外键约束,因为键列中存在空数据。因此,如果我通过将强制执行外键约束设置为来禁用外键,要插入该行数据并再次启用它以用于将来的事务将是一个问题现有数据?

1 个答案:

答案 0 :(得分:0)

您无需执行任何特殊操作即可在SQL Server外键中容纳NULL。如果任何引用列包含NULL,则不会检查外键约束并且不会违反:

create table T1 (
    ID int not null,
    constraint PK_T1 PRIMARY KEY (ID)
)
go
create table T2 (
    ID int not null,
    T1ID int null,
    constraint PK_T2 PRIMARY KEY (ID),
    constraint FK_T2_T1 FOREIGN KEY (T1ID)
        references T1(ID)
)
go
insert into T1(ID) values (1),(2)
go
insert into T2(ID,T1ID) values (1,1), (2,null)
go

这样运行没有任何错误。

关于禁用外键,通常应该避免这样做,特别是如果目标是插入违反键的数据。即使您可以以仅验证新数据的方式重新启用密钥,密钥也永远不会信任(并且理所当然)。

因此,查询优化器将无法使用外键约束来获取最佳查询计划。