POSTGRESQL外键如约束

时间:2011-12-12 17:06:41

标签: postgresql

我有一个名为Order

的tableA

它有一个PK id 几列和一个名为active的bool列以及一列 tableid 。对于 tableid ,两个订单无法同时处于活动状态,这可以通过两列唯一约束(&& active = true)来确保,该约束与索引一样工作并且查找活动订单的速度相当快。
问题是还有另一个表 orderitems 。除非order-id的所有订单都标记为paid = true,否则我希望active为true 使用序列化交易,我认为这可以通过在支付所有项目时设置更新查询来实现支付代码。我认为这不会一直有效。因为如果它们同时运行,它们可能都会看到有未付款的项目(由于旧快照)但是在提交时它们会支付所有项目,但不会更新活动列。(不同)。
添加新项目和支付交易尝试设置active = false将不会成为串行事务的问题,因为其中一个会失败..
我认为触发器是一种解决方案,但我不知道该怎么做......谢谢你的阅读

1 个答案:

答案 0 :(得分:2)

您要做的是在AFTER UPDATE OR INSERT OR DELETE FOR EACH ROW上添加orderitems触发器,以确定是否应更改Order.active。您必须在拥有SELECT ... FOR UPDATE的{​​{1}}行上执行Order,否则您将面临并发运行的触发器相互竞争并进行无序更新的风险

假定orderitems有一个字段orderitems,它是order_id的外键引用,请尝试以下代码:(未经测试,仅举例说明)代码:

Order.id