SAB*_*BER 0 sql postgresql duplicates postgresql-9.4
我目前在旧数据库(postgres 9.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.
Run Code Online (Sandbox Code Playgroud)
注意:由于数据库版本较旧,我无法使用冲突。
据推测,您不希望新行重复历史行。如果是这样,您可以执行此操作,但需要修改表并添加新列。
alter table t add duplicate_seq int default 1;
Run Code Online (Sandbox Code Playgroud)
然后更新此列以识别现有的重复项:
update t
set duplicate_seq = seqnum
from (select t.*, row_number() over (partition by col order by col) as seqnum
from t
) tt
where t.<primary key> = tt.<primary key>;
Run Code Online (Sandbox Code Playgroud)
现在,创建一个唯一索引或约束:
alter table t add constraint unq_t_col_seq on t(col, duplicate_seq);
Run Code Online (Sandbox Code Playgroud)
插入行时,不要提供 的值duplicate_seq
。默认为1
. 这将与任何现有值或最近输入的重复值发生冲突。允许历史重复。
归档时间: |
|
查看次数: |
1696 次 |
最近记录: |