【问题标题】:Trigger check if some values are equal in some row in table then update if not then insert触发检查表中某行中的某些值是否相等,如果不相等则更新然后插入
【发布时间】: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


【解决方案1】:

几天后,我发现我对触发器如何工作的了解是错误的。所以我的错误是我添加了 INSERT 功能,但如果没有具有相同发件人、收件人和标题的消息,INSERT 无论如何都会完成.这就是为什么我总是得到不定式循环。 所以可以工作的代码是belove

CREATE OR REPLACE FUNCTION provjera_teme()
RETURNS TRIGGER
AS $$
    DECLARE postoji BOOLEAN;
    BEGIN
        postoji := EXISTS(
            SELECT poruka
            FROM poruka
            WHERE posiljatelj = NEW.posiljatelj
              AND primatelj = NEW.primatelj
              AND (naslov = NEW.naslov OR naslov LIKE 'Re: ' || NEW.naslov)
            );    
        IF postoji THEN
            UPDATE poruka
            SET naslov = 'Re: ' || naslov
            WHERE posiljatelj = NEW.posiljatelj
                  AND primatelj = NEW.primatelj
                  AND naslov = NEW.naslov AND naslov NOT LIKE 'Re%';
                RETURN NULL;
        END IF;
        RETURN NEW;
    END;
$$
LANGUAGE plpgsql;

CREATE TRIGGER tema_provjera
BEFORE INSERT
ON poruka
FOR EACH ROW EXECUTE PROCEDURE provjera_teme(); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-18
    • 2023-01-30
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多