2012-09-11 54 views
2

我学习SQL,并有一些表像下面:父母与子女表 - 确保儿童完成

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

(*表示主键,这在客户和员工的情况下,既一个PK和一个FK回人)

客户和员工都是人的类型,我想确保当一个记录被插入人时,记录也必须插入到任何客户或员工,但不是两者。在这个例子中,一个人不能既是员工又是客户。

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

+0

您不必使用触发器。你可以做一个插入2行的过程。 –

+0

您正在使用哪些DBMS?甲骨文? PostgreSQL的? –

+0

你确定触发是你想要的吗?根据您在此处的设计,触发器可能没有所需的所有信息来正确填充要填充的两个表中的任何一个。您可能想要将应用程序代码中的插入作为事务的一部分来处理。 – kolossus

回答

2

根据你的DBMS支持等因素的影响,您可以:通过被实施,以确保正确的行为的存储过程

  • 插入。
  • 或者在视图上使用触发器(即与特定子类型联接超类型)以使视图“可更新”,然后插入到视图中。
  • 或者通过纯声明的方式确保子类型的排他性和存在性,正如解释here
  • 或者如here所述,使用不同于“各个表中的所有类”的继承的实现策略。
1

如果您想确保某人是客户或员工,则可以在名为“类型”的人员表中创建一个列,例如,其值可以为“客户”和“员工”或“1 “和”2“。 然后按照上面的注释建议,将相关信息插入到Customer或Employee表中。

+0

好的,我理解这种方法。但是多表方法更灵活吗? – xingyu