简体   繁体   English

触发检查表中某些行中的某些值是否相等,如果不是则更新然后插入

[英]Trigger check if some values are equal in some row in table then update if not then insert

I'm having problem with trigger in psql which needs to check if some values already exist(sender, reciever, subject) in table and if they exist i only need to update one value(subject = RE: +subject) in that row, if not then I need to insert new row. 我在psql中遇到触发器问题需要检查表中是否存在某些值(发送者,接收者,主题),如果它们存在,我只需更新该行中的一个值(subject = RE:+ subject),如果没有那么我需要插入新行。

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(); 

So after I want to insert new row which already have same values for sender, reciever and subject trigger gets in infinitive loop. 因此,在我想插入已经具有相同发送方值的新行之后,接收方和主题触发器将进入不定式循环。

What am I doing wrong? 我究竟做错了什么?

After few days I have figured out that my knowledge of how triggers work was wrong.. so my mistake was that I was adding INSERT function but INSERT will be done anyway if there wasn't message with same sender, recipient and title.That's why I was always getting infinitive loop. 几天后我发现我对触发器工作原理的了解是错误的。所以我的错误是我添加了INSERT函数但是如果没有相同发件人,收件人和标题的邮件,INSERT也会完成。这就是为什么我总是得到不定式的循环。 So the code that will work is 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(); 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM