如果表中的值超过最大值,则使值等于最大值

时间:2013-12-29 18:13:03

标签: postgresql

在Postgres表中,如果我有一个带有某种检查的列(例如hpCHECK (hp < 100)),并且我给DB HP值101,那么它将会出错

我如何确保数据库只会在hp超过最大值时插入最大值100?

编辑:我正在使用Postgres v.9.3.2,不确定是否重要

1 个答案:

答案 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;