考慮這個例子的模式:如何在插入引用其他兩個表的第三個表時檢查兩個表之間的約束?
Customer (int CustomerId pk, ....)
Employee (int EmployeeId pk,
int CustomerId references Customer.CustomerId, ....)
WorkItem (int WorkItemId pk,
int CustomerId references Customer.CustomerId,
null int EmployeeId references Employee.EmployeeId, ....)
基本上,三個表:
- 一位顧客表的主鍵和一些附加列
- 與主鍵的員工表的外鍵約束引用客戶表主鍵,表示客戶的員工。
- 工作項目表,存儲爲客戶完成的工作,以及關於執行工作的特定員工的信息。
我的問題是。在添加新工作項目時,我如何在數據庫級別測試員工是否實際與客戶關聯。
如果例如Scott(員工)在Microsoft(客戶)工作,Jeff(員工)在StackOverflow(客戶)工作,我如何防止某人將工作項添加到數據庫中,並且客戶= Microsoft,僱員=傑夫,這是沒有道理的?
我可以使用檢查約束或外鍵嗎?還是我需要一個觸發器來手動測試它?
應該提到,我使用SQL Server 2008的
更新:我要補充一點,WorkItem.EmployeeId可以爲空。
謝謝,埃吉爾。
對不起,忘了提及WorkItem.EmployeeId可以爲null。以上是否仍然有效? – 2009-01-31 14:14:39
嗯,不知道;我認爲有些RDBMS可以處理,其他的不能,我不知道SQL Server是否可以。如果沒有,你可以爲每個客戶定義一個「沒有人」的員工。否則就需要更復雜的CHECK條件。 – Kieron 2009-01-31 14:22:48
好的謝謝。因此,當我嘗試執行上面的SQL時,出現以下錯誤消息:被引用表'Employee'中沒有與外鍵「FK_Customer_Employee」中的引用列表匹配的主鍵或候選鍵。 我的員工表中缺少什麼? – 2009-01-31 14:31:13