【问题标题】:ERROR: check constraint is violated by some row错误:某些行违反了检查约束
【发布时间】: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


【解决方案1】:

当您添加新约束时,它会针对表中存在的每一行进行评估。您的函数将为已存在的每一行返回 false,因此您会收到错误消息。

解决方案是像上面建议的那样添加一个唯一约束comment by ahwnn

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

只是为了让您的约束起作用的实验:从一个始终返回 true 的函数开始,然后添加约束,然后根据需要更改函数以使其行为。

【讨论】:

  • 您好,感谢您的回答。我不能使用唯一约束,因为我是从其他数据库中获取这些信息的。我把问题简单化了,但是真正的数据库有一个唯一的 id(工作正常)和一个来自一个或另一个数据库的“object_id”。我尝试做的是确保我不会添加来自两个不同数据库的两个相同用户。 (user_id 是由记录的 ​​creation_date 创建的 bigint)。所以我真正需要做的是确保我没有为这些信息插入数据库中已经存在的值(而 2 个 user_id 可以是不同的用户)
  • 我将尝试编辑函数并使用触发器并回复您。
  • 更新:添加约束后编辑函数效果很好,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2015-08-30
  • 2021-02-25
  • 1970-01-01
  • 1970-01-01
  • 2016-12-13
  • 2017-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多