在现有 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';
我想在现有 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';