【发布时间】:2020-01-22 15:38:13
【问题描述】:
我的 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'
/
我显然不明白。
可以帮忙吗?
谢谢!
【问题讨论】:
-
请不要添加太多不同的 Postgres 版本 - 如果您确实使用不受支持的版本,请仅添加 那个 版本的标签。
-
为什么不创建一个唯一索引呢?这是确保唯一性的最有效方式
-
因为数据来自不同的数据库。我在这张表上有一个 unique_id,但也有一个“id”,它是来自其他数据库的 id。因此,两个用户可以有相同的 id 但不同,所以我必须确保他们不一样。 (通过比较 id(由创建日期创建)和所有其他信息)
-
您仍然可以为其添加唯一索引
-
它是如何工作的,具体是做什么的?谢谢。
标签: postgresql