父母和子女表 - 确保儿童完整

时间:2012-09-11 06:30:32

标签: sql database-design triggers

我正在学习SQL并且有一些表格如下:

Person (id*, name)
Customer(id*, is_active, ...)
Employee(id*, department_id, ...)

(*表示主键,在Customer和Employee的情况下,PK和FK都是人员)

Customer和Employee都是Person的类型,我想确保当记录插入Person时,记录也必须插入到EITHER Customer或Employee中,但不能同时插入。在此示例的限制范围内,人员不能同时是员工和客户。

我被告知触发器对强制执行此约束很有用。有人可以用这个简单的例子解释一下触发器的用法吗?

3 个答案:

答案 0 :(得分:3)

您可以使用INSTEAD OF触发器。您的问题已在此MSDN文章(Designing INSTEAD OF Triggers)

中完整涵盖

答案 1 :(得分:2)

根据您的DBMS支持的内容和其他因素,您可以:

  • 通过实施的存储过程插入以确保正确的行为。
  • 或者在视图上使用触发器(使用特定子类型加入超类型)以使视图“可更新”,然后插入到视图中。
  • 或者通过纯粹的陈述方式确保子类型的排他性和存在性,如here所述。
  • 或者使用与“单独表中的所有类”不同的继承实现策略,如上所述here

答案 2 :(得分:1)

如果要确保某人是Customer或Employee,您可以在Person表中创建一个名为“Type”的列,它可以具有值“Customer”和“Employee”或“1”和“2”。 然后按照上面评论的建议将相关信息插入Customer或Employee表中。