3

代表强制参与 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));
4

2 回答 2

4

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

逻辑是:

  • 插入父记录;这安排了触发器
  • 插入子记录,至少一条
  • 犯罪

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

于 2013-01-04T01:59:30.180 回答
0

总结一下,这个问题可以通过以下方式解决:

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

我要尝试所有这些。

于 2013-01-22T20:00:20.597 回答