【发布时间】:2016-10-26 06:25:46
【问题描述】:
我在 psql 中遇到触发器问题,它需要检查表中是否已经存在某些值(发送者、接收者、主题),如果它们存在,我只需要更新一个值(主题 = RE:+主题)该行,如果没有,我需要插入新行。
CREATE OR REPLACE FUNCTION check_theme()
RETURNS TRIGGER
AS $$
DECLARE e BOOLEAN;
BEGIN
e := EXISTS(
SELECT *
FROM message
WHERE sender = NEW.sender
AND reciever = NEW.reciever
AND subject = NEW.subject
);
IF NOT e THEN
INSERT INTO message(sender, reciever, subject, text)
VALUES(NEW.sender, NEW.reciever, NEW.subject, NEW.text);
ELSE
UPDATE message
SET subject = 'Re: ' || NEW.subject
WHERE sender = NEW.sender
AND reciever = NEW.reciever
AND subject = NEW.subject;
END IF;
RETURN NEW;
END;
$$
LANGUAGE plpgsql;
CREATE TRIGGER theme_check
BEFORE INSERT OR UPDATE
ON message
FOR EACH ROW EXECUTE PROCEDURE check_theme();
所以在我想插入已经具有相同值的新行之后,发送者、接收者和主题触发器进入不定式循环。
我做错了什么?
【问题讨论】:
-
BEFORE INSERT触发器应该只是说IF e THEN NEW.subject = 'Re: ' || NEW.subject;。不过,我不确定您在AFTER UPDATE案例中想要什么……您真的希望更新触发新的插入到表中吗? -
为了更清楚,我需要解决这个问题:实现触发器并触发适当的函数“check_theme”,对于消息表中的每个条目,将检查是否已经有来自同一发件人的消息,收件人和具有相同的标题。如果有更改标题以包含前缀“Re:” 示例:如果已经有此类主题,则“Hello”的标题将更改为“Re:Hello”。如果没有,则需要插入新消息。
标签: sql postgresql triggers