启用/禁用唯一约束验证

时间:2018-09-19 20:03:37

标签: postgresql duplicates unique-constraint

我想知道是否有任何方法可以在PostgreSQL中启用或禁用UNIQUE约束的验证,或者是否有其他方法允许重复记录。

目前,我正在使用具有参数check duplicate的存储过程:

  • 如果参数为true,则代码运行IF EXISTS (SELECT TRUE FROM table WHERE column = column_to_insert)并引发DuplicateKeyException。

  • 如果check duplicatefalse,它只会执行INSERT

但是我怀疑此解决方案在比赛条件下并不安全。

1 个答案:

答案 0 :(得分:1)

您的功能不安全,因为可能存在并发事务

  1. 在您的INSERT

  2. 之前开始 运行IF EXISTS检查时
  3. 尚未完成

  4. 插入冲突的行

然后,您将得到意外的重复。

您可以将SELECT变成SELECT ... FOR UPDATE,以缩小竞争条件的窗口,但是除非使用SERIALIZABLE事务隔离级别,否则您无法关闭它。

该功能并不能防止您以后有人在不需要的位置插入重复值。

也许BEFORE触发器和可序列化的事务是执行此操作的最佳方法。