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

Sql 由于外键约束,使用INSERT和UPDATE语句禁用外键约束,sql,sql-server,Sql,Sql Server,我在将数据插入数据库时受到外键约束,因为键列中有空数据。因此,如果我通过将强制外键约束设置为否来禁用外键,插入这一行数据并在将来的事务中再次启用它,现有数据会有问题吗?您不必做任何特殊的事情来适应SQL Server外键中的NULL。如果任何引用列包含NULL,则不会检查外键约束,也不会违反外键约束: create table T1 ( ID int not null, constraint PK_T1 PRIMARY KEY (ID) ) go create table T2

我在将数据插入数据库时受到外键约束,因为键列中有空数据。因此,如果我通过将强制外键约束设置为来禁用外键,插入这一行数据并在将来的事务中再次启用它,现有数据会有问题吗?

您不必做任何特殊的事情来适应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
这运行时没有任何错误

关于禁用外键,通常应该避免这样做,尤其是当目标是插入与该键冲突的数据时。即使您可以以只验证新数据的方式重新启用密钥,但该密钥永远不会被信任(这是理所当然的)


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

只需使用isnull(列,0)传递0而不是null。这样,您就不必强制执行任何内容。您可以清楚地知道您试图在何处插入此
null
值吗?列是外键引用的一部分还是实际的(主/唯一)键列?如果是后者,则外键不相关。如果是前者,我相信大多数数据库系统将不会强制执行外键约束。但可能存在相关的特定于产品的设置。您可以使用可延迟的外部设置keys@Damien_The_Unbeliever这是sql server