Sql-Server
兩個針對同一個 PRIMARY 表的 SET NULL 的 FOREIGN KEY 約束
我覺得我在這裡遺漏了一些明顯的東西……
我有一個主表(我們稱之為
People
)和一個輔助表(我們稱之為Groups
)的情況,它們有兩個不同的角色,人們可能會擔任(Secretary
&Treasurer
)。這兩列都是int
和 FK 回到People.ID
.CREATE TABLE People( ID int NOT NULL, FullName varchar(50) NOT NULL, CONSTRAINT [PK_People] PRIMARY KEY CLUSTERED (ID ASC)) CREATE TABLE Groups( ID int NOT NULL, Treasurer int NULL, Secretary int NULL, CONSTRAINT PK_Groups PRIMARY KEY CLUSTERED (ID ASC))
到現在為止還挺好。但是角色是可選的(可以為空),所以我希望能夠刪除一個人並將組中的 FK 值設置為 NULL。
ALTER TABLE dbo.Groups ADD CONSTRAINT FK_Groups_Treasurer FOREIGN KEY (Treasurer) REFERENCES dbo.People (ID) ON DELETE SET NULL ALTER TABLE dbo.Groups ADD CONSTRAINT FK_Groups_Secretary FOREIGN KEY (Secretary) REFERENCES dbo.People (ID) ON DELETE SET NULL
現在我們有一個問題:
在表 ‘Groups’ 上引入 FOREIGN KEY 約束 ‘FK_Groups_Secretary’ 可能會導致循環或多個級聯路徑。
這裡有什麼問題,為什麼 SQL Server 關心?什麼是可能的級聯衝突?如果我刪除 a
Person
,請將任何相關表中的 FK 值設置為 NULL。這對於兩個不同的表來說是沒有問題的,每個表都有一個 FK。但是似乎禁止在同一個表中包含兩個 FK 值。我錯過了什麼嗎?這是某種糟糕的設計嗎?處理這種情況的正確方法是什麼?這似乎是一個常見的案例。
看起來你有級聯刪除,你最終會刪除理論上可以在另一個組中被引用為財務主管或秘書的人。
組表違反了第一範式。這類似於在表中包含地址 1、地址 2。
您需要第三個表 GroupPersonRole,其中包含 groupid、person id 和 roleid。
在一張表中定義你的人。在另一個表中定義您的組。並在另一個表中定義您的角色。然後在第四個中,比如 GroupPersonRole,您可以將它們組合起來並根據需要繪製您的 FK。
如果有人想添加更多組角色怎麼辦?您不希望每次有人有新想法時都修改架構。