2017-05-25 75 views
0

由于键列中存在空数据,因此在将数据插入数据库时​​出现外键约束。因此,如果我通过制作强制外键约束来禁用外键,要插入该行数据并将其再次启用以用于将来的事务处理,那么对于现有数据而言,这会是一个问题吗?使用由于外键约束导致的INSERT和UPDATE语句来禁用外键约束

+0

只是使用isnull(列,0)传递0来代替null。通过这个你不必强制执行任何东西 – Ravi

+0

你可以清楚你想要在哪里插入'null'值吗?是*外键引用*的列部分还是实际(主键/唯一键)列?如果是后者,外键是不相关的。如果前者,*大多数*数据库系统,我相信,已经不执行该外键约束。但可能存在与产品相关的特定设置。 –

+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 

这种运行没有任何错误。

关于禁用外键,通常应该避免这样做,特别是如果目标是插入违反密钥的数据。即使您可以重新启用密钥以使其仅验证新数据,密钥永远不会是受信任的(以及正确的)。

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