如何在Postgres中实现列值更改约束

时间:2014-07-30 13:43:52

标签: sql postgresql constraints

我想确保列的值只能以定义的方式更改。示例是包含状态值的列,该状态值必须仅根据定义的状态转换而更改)或列可以从NULL设置为仅一次的值。

我想避免在应用层上实施这些检查。

我找不到使用常规约束的解决方案。是否有另一种方法可以实现这一点,或者数据库层有意不支持这样的约束?

2 个答案:

答案 0 :(得分:2)

约束只能根据行的当前值(检查约束)执行规则   - 或不同表中相关行的当前状态之间的参照完整性(外键约束)
  - 或在有限范围内对表中所有行的当前值(排除约束)。

您希望在上一个状态和当前状态之间强制执行约束。这通常用trigger实现 例如:

SO上有很多示例。 Try a search.

答案 1 :(得分:0)

我编写了一个python脚本,该脚本基于所需的限制生成CHECK限制。这些限制会强制为每个状态设置空列。

例如当我有“订单”表并且订单可以具有“已付款”或“未付款”状态时,可以说有一列“ Invoice_number”为文本类型。如果您想将任何订单更新为“已付款”状态,那么除非您将“发票编号”从NULL设置为某个非NULL值,否则检查约束将不允许这样做。

简单的CHECK可能看起来像这样:

ALTER TABLE orders ADD CONSTRAINT orders_state_paid_check CHECK ( CASE WHEN state = 'paid' AND (invoice_number is null) THEN false ELSE true END);

您可以在此处检查该工具:https://github.com/Najiva/check_gen

现在它正在使用postgres> 9.4。