首页 文章

错误:重复键值违反了postgreSQL中的唯一约束

提问于
浏览
4

我在更新表时在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正在检查约束并在更新第二行之前抛出错误 .

有没有办法避免这种情况?

1 回答

  • 5

    http://www.postgresql.org/docs/9.0/static/sql-createtable.html in section "Non-deferred Uniqueness Constraints" - "When a UNIQUE or PRIMARY KEY constraint is not deferrable, PostgreSQL checks for uniqueness immediately whenever a row is inserted or modified."

    将您的唯一约束更改为可延迟将阻止检查,直到更新结束 . 要么使用SET CONSTRAINTS在会话级别禁用(这是令人讨厌的重复),要么使用deferrable选项删除并重新创建唯一性约束(我不知道ALTER构造在不丢弃的情况下执行此操作) .

相关问题