【问题标题】:Parent and Child tables - ensuring children are complete父子表 - 确保孩子是完整的
【发布时间】:2012-09-11 06:30:32
【问题描述】:

我正在学习 SQL,并且有一些类似于以下的表:

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

(* 表示主键,在 Customer 和 Employee 的情况下,主键是返回到 Person 的 PK 和 FK)

Customer 和 Employee 都是 Person 类型,我想确保在将一条记录插入 Person 时,一条记录也必须插入 Customer 或 Employee 中的任何一个,但不能同时插入两者。在本示例的限制范围内,Person 不能既是员工又是客户。

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

【问题讨论】:

  • 您不必使用触发器。您可以制作一个插入 2 行的程序。
  • 您使用的是哪个 DBMS?甲骨文? PostgreSQL?
  • 您确定触发器是您想要的方式吗?根据您在此处的设计,触发器可能没有正确填充您要填充的两个表中的任何一个所需的所有信息。您可能希望在应用程序代码中将插入作为事务的一部分处理
  • DBMS 是 PostgreSQL。我只是担心我需要执行上述规则,并理解触发器可能是执行此操作的最佳方式。我想作为事务的一部分做所有事情也可以确保这一点,但它假设操作员在插入/更新/删除行时会这样做

标签: sql database-design triggers


【解决方案1】:

您可以使用 INSTEAD OF 触发器。您的问题已在这篇 MSDN 文章(Designing INSTEAD OF Triggers) 中全面介绍

.

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      如果您想确定一个人是客户还是员工,您可以在 Person 表中创建一个名为“Type”的列,例如,它的值可以是“Customer”和“Employee”或“1”和“2”。 然后按照上面评论的建议将相关信息插入到 Customer 或 Employee 表中。

      【讨论】:

      • 好的,我理解这种方法。但是多表方法是否更灵活?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-01
      • 2019-11-24
      相关资源
      最近更新 更多