【发布时间】:2023-04-05 14:44:01
【问题描述】:
我有一张这样的桌子Content:
id | text | date | idUser → User | contentType
还有一张桌子Answer:
idAnswer → Content | idQuestion → Content | isAccepted
我想确保Answer 的日期大于Question 的日期。问题是 Content 和 contentType = 'QUESTION'。
我尝试使用以下触发器解决此问题,但是当我尝试插入 Answer 时出现错误:
ERROR: record "new" has no field "idanswer" CONTEXT: SQL statement "SELECT (SELECT "Content".date FROM "Content" WHERE "Content".id = NEW.idAnswer) < (SELECT "Content".date FROM "Content" WHERE "Content".id = NEW.idQuestion)" PL/pgSQL function "check_valid_date_answer" line 2 at IF
触发器:
CREATE TRIGGER check_valid_answer
AFTER INSERT ON "Answer"
FOR EACH ROW EXECUTE PROCEDURE check_valid_date_answer();
触发功能:
CREATE FUNCTION check_valid_date_answer() RETURNS trigger
LANGUAGE plpgsql
AS $$BEGIN
IF (SELECT "Content".date FROM "Content"
WHERE "Content".id = NEW.idAnswer)
< (SELECT "Content".date FROM "Content"
WHERE "Content".id = NEW.idQuestion)
THEN
RAISE NOTICE 'This Answer is an invalid date';
END IF;
RETURN NEW;
END;$$;
所以,我的问题是:我真的需要为此创建一个触发器吗?我看到我不能在Answer 中使用CHECK,因为我需要与另一个表的属性进行比较。有没有其他(更容易/更好)的方法来做到这一点?如果不是,为什么会出现错误以及如何解决?
【问题讨论】:
-
您的
create function拥有if (select。错误消息显示SELECT (SELECT。您确定问题中的代码与产生错误的代码相对应吗? -
@Gordon Linoff 该函数是在
phpPgAdmin图形界面中创建的,但我是从那里导出的文件中复制粘贴的。
标签: sql postgresql database-design triggers constraints