【问题标题】:"check constraint is violated by some row" adding check constraint“某些行违反了检查约束”添加检查约束
【发布时间】:2014-03-30 02:30:04
【问题描述】:

我有一张桌子Tag(id, name, description, isAccepted),

一个表Content(id, text, date, idUser → User, contentType)

还有一个TagQuestion(idQuestion → Content, idTag → Tag)

并且我想确保特定问题只有 5 个或更少的相关标签(类似于 StackOverflow)

所以,我创建了一个函数:

CREATE FUNCTION can_insert_tag_question(integer) RETURNS boolean
    LANGUAGE plpgsql
    AS $_$
  BEGIN
    IF EXISTS (SELECT "idQuestion" FROM "TagQuestion" WHERE "idQuestion" = $1 GROUP BY "idQuestion" HAVING COUNT("idTag") <= 4) 
    THEN 
      RETURN TRUE;
    ELSIF NOT EXISTS (SELECT "idQuestion" FROM "TagQuestion" WHERE "idQuestion" = $1)
    THEN
      RETURN TRUE;
    ELSE
      RETURN FALSE;
    END IF;
  END;
$_$;

并在TagQuestion 中尝试添加CHECK 约束来验证是否可以插入:

ALTER TABLE "public"."TagQuestion" ADD CONSTRAINT "valid_tag" CHECK (can_insert_tag_question("idQuestion"))

但我收到一条错误消息:

ERROR:  check constraint "valid_tag" is violated by some row

这是什么意思?我该如何解决?

【问题讨论】:

    标签: sql database postgresql


    【解决方案1】:

    这意味着您的检查约束正在起作用。它可以更简单:

    create function can_insert_tag_question(_id integer)
    returns boolean as $$
        with s as (
            select 1
            from "TagQuestion"
            where id = _id
            limit 5
        )
        select count(*) < 5
        from s;
    $$ language sql;
    

    它也更快,因为没有分组,它会在找到 5 行后立即停止扫描表,而不是在整个表中计数。

    【讨论】:

    • 我删除了我在TagQuestion 中的每一行,并再次添加了检查并且它起作用了。但是,我在同一个问题中插入了 6 个Tags,它允许我这样做。
    • 我替换了您的建议,现在可以了。顺便说一句,它不允许我使用参数名称,必须像以前一样将其替换为$1。任何线索为什么?
    • @Hugo 什么版本? select version()
    • PostgreSQL 9.1.12 on i686-pc-linux-gnu, compiled by gcc-4.4.real (Debian 4.4.5-8) 4.4.5, 32-bit
    【解决方案2】:

    这意味着您的表中存在未通过约束的现有数据。您可以通过以下方式找到它:

    select t.*
    from TagQuestion t
    where not can_insert_tag_question("idQuestion")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-30
      • 2017-03-01
      • 2014-11-27
      • 2014-12-09
      • 2014-03-23
      • 1970-01-01
      • 2016-12-13
      • 2018-01-04
      相关资源
      最近更新 更多