我想确保列的值只能以定义的方式更改。示例是包含状态值的列,该状态值必须仅根据定义的状态转换而更改)或列可以从NULL
设置为仅一次的值。
我想避免在应用层上实施这些检查。
我找不到使用常规约束的解决方案。是否有另一种方法可以实现这一点,或者数据库层有意不支持这样的约束?
答案 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。