我目前在我们的旧数据库(postgres9.4)表中遇到一个问题,它包含一些重复的行。我想确保不再生成重复的行。
但是我还想保留已经生成的重复行。因此,我无法对这些列(多列)应用唯一约束。
我创建了一个触发器,它将检查行是否已经存在,并相应地引发异常。但在处理并发事务时,它也会失败。
例子:
TAB1
col1 | col2 | col3 |
------------------------------------
1 | A | B | --
2 | A | B | -- already present duplicates for column col2 and col3(allowed)
3 | C | D |
INSERT INTO TAB1 VALUES(4 , 'A' , 'B') ; -- This insert statement will not be allowed.
注意:由于数据库版本较旧,我无法在冲突中使用。
2条答案
按热度按时间6tqwzwtp1#
想必,您不希望新行复制历史行。如果是这样,您可以这样做,但需要修改表并添加新列。
然后更新此列以标识现有的重复项:
现在,创建唯一索引或约束:
插入行时,不要为
duplicate_seq
. 默认值为1
. 这将与任何现有值冲突,或者与最近输入的重复值冲突。允许历史复制。8ljdwjyq2#
您可以尝试创建部分索引,以便仅对表行的子集具有唯一约束:
例如: