[英]Postgresql Unique constraint not valid
我需要对文本字段中的表强制执行唯一约束,以确保用户不会输入包含相同地址的行。 我不想验证它,但需要保留旧记录
我用无效子句做了一些检查约束,但不知道如何使它唯一
如何使唯一检查约束无效
我会在表中添加一个新列:
ALTER TABLE atable ADD is_new boolean DEFAULT FALSE NOT NULL;
ALTER TABLE atable ALTER is_new SET DEFAULT TRUE;
然后旧行将被标记,您可以
CREATE UNIQUE ON atable (col1) WHERE is_new;
这将充当“条件唯一约束”。
请注意,在版本 11 之前添加具有默认值的列将导致(可能很慢)表重写。
你不能:
https://www.postgresql.org/docs/current/sql-altertable.html
“添加 table_constraint [无效]
这种形式使用与 CREATE TABLE 相同的约束语法以及选项 NOT VALID 向表添加新约束,该选项当前仅允许用于外键和 CHECK 约束。”
CHECK 约束也只能在当前行上起作用,因此它们不能在所有行中强制唯一性。 要执行您想要的操作,您正在查看 ON INSERT 触发器。
如果我理解正确,您可以使用标志来执行此操作。 但是您想设置标志,以便每个现有地址的一行都设置了标志。
ALTER TABLE t ADD address_for_duplicates boolean DEFAULT true NOT NULL;
然后,对于现有行,我将假设您有一个主键pk
:
update t
set address_for_duplicates = (seqnum = 1)
from (select t.*, row_number() over (partition by address order by pk) as seqnum
from t
) tt
where tt.pk = t.pk;
现在添加一个过滤的唯一索引:
create unique index unq_t_address_some_duplicates
on t(address)
where address_for_duplicates;
这将防止现有地址被复制(再次)以及新地址。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.