2017-05-25 54 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 

這種運行沒有任何錯誤。

關於禁用外鍵,通常應該避免這樣做,特別是如果目標是插入違反密鑰的數據。即使您可以重新啓用密鑰以使其僅驗證新數據,密鑰永遠不會是受信任的(以及正確的)。

因此,查詢優化器將無法使用外鍵約束來獲得最佳查詢計劃。