我有一个表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
这是什么意思?我该如何解决?
答案 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")