"检查约束被某些行违反"添加检查约束

时间:2014-03-29 18:07:19

标签: sql database postgresql

我有一个表Tag(id,name,description,isAccepted),

Content(id,text,date,idUser→User,contentType)

TagQuestion(idQuestion→内容,idTag→标签)

我希望确保特定问题只有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

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

2 个答案:

答案 0 :(得分: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行而不是在整个表中计数时停止扫描表。

答案 1 :(得分:0)

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

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