我想知道是否有任何方法可以在PostgreSQL中启用或禁用UNIQUE
约束的验证,或者是否有其他方法允许重复记录。
目前,我正在使用具有参数check duplicate
的存储过程:
如果参数为true
,则代码运行IF EXISTS (SELECT TRUE FROM table WHERE column = column_to_insert)
并引发DuplicateKeyException。
如果check duplicate
是false
,它只会执行INSERT
。
但是我怀疑此解决方案在比赛条件下并不安全。
答案 0 :(得分:1)
您的功能不安全,因为可能存在并发事务
在您的INSERT
IF EXISTS
检查时尚未完成
插入冲突的行
然后,您将得到意外的重复。
您可以将SELECT
变成SELECT ... FOR UPDATE
,以缩小竞争条件的窗口,但是除非使用SERIALIZABLE
事务隔离级别,否则您无法关闭它。
该功能并不能防止您以后有人在不需要的位置插入重复值。
也许BEFORE
触发器和可序列化的事务是执行此操作的最佳方法。