Foreign-Key
固定值欄位的外鍵約束
注意:我是開發人員…
我有一個資產表,其中有許多程式碼是第二個表 OutlineFiles 的外鍵。OutlineFiles 表將 Type 和 Code 作為主鍵。外鍵約束需要看起來像這樣……
ALTER TABLE "dbo"."Assets" ADD CONSTRAINT "Locations" FOREIGN KEY ( "LN", "LocationCode" ASC ) REFERENCES "dbo"."OutlineFiles" ( "Type", "Code" ); ALTER TABLE "dbo"."Assets" ADD CONSTRAINT "CostCentre" FOREIGN KEY ( "CC", "CostCentreCode" ASC ) REFERENCES "dbo"."OutlineFiles" ( "Type", "Code" );
因此,將通過“LN”和“CC”的固定值與輪廓表建立關係。或者將數據庫更改為有兩個表並刪除 OutlineFiles 表上的 Type 列會更容易嗎?我在 Sybase 中嘗試這樣做,但我們支持許多數據庫。
聽起來您有一個“一個真正的查找表”(OTLT)反模式,並且您在此表中混合實體。您已經找到了為什麼這不是一個好主意:
- 不能有過濾的外鍵
- 不能對常量進行 FK
- 不能有多個父母
您上面的範常式式碼令人困惑(同一 Code 列有多個父級),所以我會告訴您我的理解
CREATE TABLE OutlineFilesCostCentre ( CostCentreCode ...NOT NULL --PK ... ) CREATE TABLE OutlineFilesLocations ( LocationCode ... NOT NULL --PK ... ) CREATE TABLE Assets ( ... CostCentreCode ... NOT NULL, LocationCode ... NOT NULL, ... CONSTRAINT FK_Assets_CostCentre" FOREIGN KEY ("CostCentreCode") REFERENCES "dbo"."OutlineFilesCostCentre" ("CostCentreCode"), CONSTRAINT FK_Assets_Locations" FOREIGN KEY ("LocationCode") REFERENCES "dbo"."OutlineFilesLocations" ("LocationCode") ...)
如果您有 30 個要查找的程式碼,您將有 30 個查找表:這是正確的。
如果您堅持使用 OTLT,則必須添加額外的列以將類型儲存在 Assets 中並將它們 FK 到您的 OTLT。我不會這樣做的。
... CostCentreType char(2) NOT NULL, CostCentreCode ... NOT NULL, LocationType char(2) NOT NULL, LocationCode ... NOT NULL, ...
或者使用觸發器來維護正確的程式碼。我也不會這樣做。