表格强制参与Postgres的关系

时间:2013-01-03 22:56:42

标签: sql postgresql triggers check-constraints

表示强制参与Postgres的最佳方式是什么?我曾经在CHECK约束中使用它,或者在Sybase中使用INSERT和DELETE TRIGGER。 Postgres不支持CHECK约束中的子查询,我无法正确获取触发器。

我想找到以下替代方案:

ALTER TABLE member
 ADD CONSTRAINT member_in_has_address
  CHECK (EXISTS (SELECT *
                 FROM address a
                 WHERE member_id = a.member_id));

2 个答案:

答案 0 :(得分:4)

我使用可延迟约束触发器解决1:m强制关系。

逻辑是:

  • 插入父记录;这会安排触发器
  • 插入子记录,至少一个
  • 提交

触发器在提交之前运行,如果它不喜欢它所看到的内容,可以通过引发异常来中止提交。

答案 1 :(得分:0)

总而言之,问题可以通过以下方式解决:

  • 在函数中定义查询,然后从CHECK约束
  • 调用它
  • 定义抛出异常然后从触发器
  • 调用它的函数
  • 定义可延迟约束触发器

我将尝试所有这些。