在Postgres表中,如果我有一个带有某种检查的列(例如hp
和CHECK (hp < 100)
),并且我给DB HP值101,那么它将会出错
我如何确保数据库只会在hp
超过最大值时插入最大值100?
编辑:我正在使用Postgres v.9.3.2,不确定是否重要
答案 0 :(得分:2)
使用before触发器执行您想要的操作:
new.value = least(100,new.value);
这将确保插入的任何行都有new.value <= 100
除非在触发器启动之前添加其他行并在此之后更改值。因此,添加额外的check()
约束也很有用。
旧答案供参考(我知道您希望在插入新的无效行时增加最大值):
您需要一个触发器,可能还需要一个序列来执行此操作。
如果偶尔出现漏洞,则需要实际锁定表格,或者获取与表格相关的咨询锁定和当前最大值:
http://www.postgresql.org/docs/current/static/explicit-locking.html
如果是,可以使用序列来避免需要获得该锁的棘手问题。你会运行类似的东西:
if not exists (select 1 from tbl where value > new.value) then
new.value := nextval('tbl_max_value_seq');
end if;