2017-07-12 37 views
0

下面是被用於地方發展的技術:Microsoft SQL Server - 如何只插入時強制外鍵,但允許孤立的外鍵保留?

  • 的Microsoft SQL Server 2016網絡版

比方說,我有一個名爲CarCompanyTable

下表
create table CarCompanyTable(

[CarCompanyid] uniqueidentifier DEFAULT newsequentialid() NOT NULL, 
    [CarCompanyName] [nvarchar](200) NOT NULL, 
    [AddressOfLocation] [nvarchar](200) NOT NULL, 
    CONSTRAINT [PK_CarCompanyid] PRIMARY KEY CLUSTERED (CarCompanyid) 
); 

比方說,我有另一張名爲CarTable的表格

create table CarTable(

[CarId] uniqueidentifier DEFAULT newsequentialid() NOT NULL, 

[CarName] [nvarchar](200) NOT NULL, 
[FKCarCompanyid] uniqueidentifier, 

CONSTRAINT [PK_CarId] PRIMARY KEY CLUSTERED (CarId), 
CONSTRAINT [FK_CarCompanyTableCarTable] FOREIGN KEY(FKCarCompanyid) REFERENCES [dbo].[CarCompanyTable] (CarCompanyid), 
); 

如何能在國外約束以這樣的方式來實施該

1)檢查是否CarCompanyid外鍵存在於一個新的插入進入CarTable

2)然而,讓那裏是孤兒CarCompanyid國外如果CarCompanyTable條目(包含相應的CarTable條目)從CarCompanyTable中刪除,則鍵入關鍵字

有人可以告訴我爲確保符合上述要求而需要做出的確切修改嗎?

回答

0

有兩種策略,大多數人遵循:

  1. 更改CarTable有一欄 「ISINACTIVE」。這使您可以將記錄標記爲「已刪除」而不刪除它們。這允許您使用正常的外鍵來保證完整性。當然,這意味着您需要相應地進行編程,只顯示未刪除的(IsInactive = False)記錄。

  2. 請勿使用外鍵進行參照完整性。相反,使用「on insert」觸發器來查找(僞)FK記錄並拋出錯誤以強制執行參照完整性。我想大多數DBA會告訴你這是一個壞主意,你應該堅持#1。

方法#2的缺點在於,一旦刪除了引用的記錄,就不能說出它曾經是什麼,並且無法恢復它。通過方法#1,您只需編寫程序來過濾非活動記錄,但如果您真的需要,可以隨時查看它們。