在现有 table 数据上使用 CHECK 添加约束

Add constraint with CHECK on existing table with data

我想在现有 table 上添加约束。以下是我的 sql 声明。

CREATE OR REPLACE FUNCTION constraintFunction(uuid, date)
RETURNS integer AS $total$
declare
    total integer;
begin
    select count(*) into total FROM table1 WHERE foreign_key_id=  AND dt=  and status ='A';
   RETURN total;
END;
$total$ LANGUAGE plpgsql;

ALTER TABLE table1
  ADD CONSTRAINT constraint1 CHECK ((constraintFunction(table1.foreign_key_id, table1.dt) < 1));

我在执行 sql 语句时收到以下错误。

SQL Error [23514]: ERROR: check constraint "constraint1" is violated by some row

我在 table1 中有一些记录。当我删除状态为“A”的数据时,sql 语句将完美运行。

有什么方法可以在不删除数据库中现有数据的情况下添加约束?

检查约束不是这里的解决方案,因为 doc 明确警告不要查看其他 rows/tables,并使用不可变函数(对于给定的输入总是相同的输出,可以缓存)

您的验证失败,因为所述约束要求没有具有给定值的行...如果行存在,则约束失败,因此您可能希望排除与当前行具有相同 ID 的行已验证。

也就是说,唯一的部分索引确实是这里所需要的。

create unique index idx_A on table1 (foreign_key_id, dt) where status ='A';