我的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'
/
我显然不明白。
可以帮忙吗?
谢谢!
答案 0 :(得分:0)
添加新约束时,将根据表中存在的每一行对其进行评估。您的函数将为已经存在的每一行返回false
,以获取错误。
解决方案是添加像以上comment by ahwnn
所示的唯一约束。作为替代方案,您可以使用触发器(在插入/更新之前)。
只是为了使约束生效的实验:从始终返回true的函数开始,然后添加约束,然后根据需要更改函数的行为。