我在更新表时在postgresql中遇到了一个独特的约束问题。我有一个包含3列的表和一个列(internal_state)上的唯一约束。该表只有两列,internal_state的值为1,0。 更新查询是
UPDATE backfeed_state SET internal_state = internal_state - 1
WHERE EXISTS (SELECT 1 FROM backfeed_state d2 WHERE d2.internal_state = 1 )
在MSSqlserver中运行此查询很好但在postgre中它会抛出唯一约束错误。 我理解的是在SQLServer更新所有行后,只有列的约束正在检查,但在postgre更新每一行后,约束正在检查。因此,在更新第一行(internal_state值从1到0)之后,postgre正在检查约束并在更新第二行之前抛出错误。
有没有办法避免这种情况?
答案 0 :(得分:5)
http://www.postgresql.org/docs/9.0/static/sql-createtable.html在“非延迟唯一性约束”一节中 - “当一个UNIQUE或PRIMARY KEY约束不可延迟时,PostgreSQL会在插入或修改行时立即检查唯一性。”
将唯一约束更改为可延迟将阻止检查,直到更新结束。要么使用SET CONSTRAINTS在会话级别禁用(这是令人讨厌的重复),要么使用deferrable选项删除并重新创建唯一性约束(我不知道ALTER构造在不丢弃的情况下执行此操作)。