1
psqlのトリガーに問題があり、テーブルおよびifにいくつかの値(送信者、受信者、件名)が既に存在するかどうかをチェックする必要がある彼らは存在する私はその行の1つの値(件名= 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();
私はすでに、送信者のために同じ値を持つ新しい行を挿入したい後ので、レシーバと対象トリガーは無限ループになります。
私は間違っていますか?
'INSERT' BEFOREトリガがちょうどIF THEN電子NEW.subject = '再:''言うべきbeloveある|| NEW.subject; '私はあなたが 'AFTER UPDATE'のケースで何を望んでいるのか分かりません...本当に更新がテーブルに新しい挿入を引き起こしたいのですか? –
私はこの問題を解決する必要があります: トリガを実装し、適切な機能 "check_theme"をトリガします。メッセージのテーブル内の各エントリに対して、同じ送信者、受信者から同じメッセージが既に存在するかどうかをチェックしますタイトル。 接頭辞「Re:」を含むタイトルが変更された場合 例:「Hello」のタイトルは「Re:Hello」に変更されます。 それ以外の場合は、新しいメッセージを挿入する必要があります。 –