0
由于键列中存在空数据,因此在将数据插入数据库时出现外键约束。因此,如果我通过制作强制外键约束到否来禁用外键,要插入该行数据并将其再次启用以用于将来的事务处理,那么对于现有数据而言,这会是一个问题吗?使用由于外键约束导致的INSERT和UPDATE语句来禁用外键约束
由于键列中存在空数据,因此在将数据插入数据库时出现外键约束。因此,如果我通过制作强制外键约束到否来禁用外键,要插入该行数据并将其再次启用以用于将来的事务处理,那么对于现有数据而言,这会是一个问题吗?使用由于外键约束导致的INSERT和UPDATE语句来禁用外键约束
您不必在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。通过这个你不必强制执行任何东西 – Ravi
你可以清楚你想要在哪里插入'null'值吗?是*外键引用*的列部分还是实际(主键/唯一键)列?如果是后者,外键是不相关的。如果前者,*大多数*数据库系统,我相信,已经不执行该外键约束。但可能存在与产品相关的特定设置。 –
你可以使用可延期的外键 –