有没有办法从现在开始对数据库强制执行唯一约束,而不删除旧的重复记录?

问题描述 投票:0回答:2

我正在使用 PostgreSQL,我想强制特定列是唯一的。

但是此表有一些遗留数据,其中存在重复的列,并且 它们必须保留不变。

因此,当我尝试强制执行约束时,它会抛出错误,表示该表已经违反了约束并且该规则不可强制执行。

如何从现在开始对数据库强制实施唯一约束,而不删除旧的重复记录?

sql postgresql constraints
2个回答
0
投票
PostGreSQL 在引用完整性约束中无法指定不应检查传递的行,但该约束仅适用于新行(相当于 Microsoft SQL Server 的 FK“不可信”约束,例如使用 CHECK 选项) ).

但是,您可以使用过程引用完整性来执行此操作(使用触发器)。


0
投票
您不能有唯一约束,但可以有部分唯一索引。

OID 不保证唯一,也不保证增量顺序,请参阅此

post

您可以添加新列,输入布尔值,

exclude_from_uniqueness

。对于现有记录(或您想要允许重复的任何记录)设置为 True,并为所有其他记录保留 null 或 false。

最后仅为未排除的行创建部分唯一索引:

create unique index pseudo_uk on mytable(myfield) where exclude_from_uniqueness is distinct from true;
    
© www.soinside.com 2019 - 2024. All rights reserved.