考虑这个例子的模式:如何在插入引用其他两个表的第三个表时检查两个表之间的约束?
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