错误:某些行违反了检查约束

时间:2020-01-22 15:38:13

标签: postgresql

我的Postgresql数据库有问题。

我尝试添加检查约束,但似乎失败了。

给我错误

"ERROR: check constraint is violated by some row"

约束是避免重复相同的行。 看起来像这样

CREATE OR REPLACE FUNCTION public.check_duplicates (character varying,bigint,numeric,numeric,bigint)  
RETURNS BOOLEAN
AS $$
        SELECT NOT EXISTS (SELECT * from db.users where name = $1 and id = $2 and weight = $3 and height = $4 and age = $5)
$$ LANGUAGE 'sql'
/

该功能运行正常。 当我尝试使用

使其成为约束时

ALTER TABLE
    "myDB"."db"."users" ADD CONSTRAINT users_ck1 CHECK (check_duplicates(name,id,weight,height,age))

这给了我错误。

当我将其作为函数调用时

select check_duplicates("Some name",1,1,1,1)

有效。

我认为也许有一些空行,所以我用

进行了检查
select * from users where name is null or id is null or weight is null or height is null or age is null

它返回了0行。

我尝试用来检查重复


SELECT * FROM
  (SELECT *, count(*)
  OVER
    (PARTITION BY
      name,
      id,
      weight,
      height,
      age
    ) AS count
  FROM users) tableWithCount
  WHERE tableWithCount.count > 1;

它返回了0行。

我现在有点迷茫。

我该如何解决?

我认为问题出在其他地方,因为当我尝试手动创建一个已经存在(在id上)的唯一性约束时,它会给我同样的错误

--/
CREATE OR REPLACE FUNCTION public.check_dup_ids (bigint)  
RETURNS BOOLEAN
AS $$
        SELECT NOT EXISTS (SELECT * from users where id = $1)
$$ LANGUAGE 'sql'
/

我显然不明白。

可以帮忙吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

添加新约束时,将根据表中存在的每一行对其进行评估。您的函数将为已经存在的每一行返回false,以获取错误。

解决方案是添加像以上comment by ahwnn

所示的唯一约束。

作为替代方案,您可以使用触发器(在插入/更新之前)。

只是为了使约束生效的实验:从始终返回true的函数开始,然后添加约束,然后根据需要更改函数的行为。