0

PostgreSQL に 2 つのテーブルがあります:( idlines,iditems,quantity ) と項目( iditems,stock )。iditemsは、の外部キーです。linesに新しい行が挿入されたときに、 itemsテーブルからstockフィールドを更新するトリガーが必要です。stockを stock=stock-quantity に置き換える必要があります。

私はPostgreSQLの経験はあまりありませんが、これが私がやったことです。残念ながら機能していません。

DROP FUNCTION function() CASCADE ;
CREATE OR REPLACE FUNCTION function() 
RETURNS TRIGGER AS $trigger$
    BEGIN
      UPDATE items SET
      stock=COALESCE(stock,0)-lines.quantity
        WHERE lines.iditems=items.iditems;
        END;


CREATE TRIGGER trigger
    AFTER INSERT ON lines
    FOR EACH ROW
    EXECUTE PROCEDURE function();
4

1 に答える 1

1

NEWおよびOLDを使用して、行トリガーで行にアクセスできます。

NEW
データ型RECORD; INSERT/UPDATE行レベル トリガーでの操作の新しいデータベース行を保持する変数。この変数はNULL、ステートメント レベルのトリガーとDELETE操作用です。

OLD
データ型RECORD; UPDATE/DELETE行レベル トリガーでの操作の古いデータベース行を保持する変数。この変数はNULL、ステートメント レベルのトリガーとINSERT操作用です。

NEWおそらく代わりに使用linesして、新しい行を返したいと思うでしょう:

UPDATE items
SET stock = COALESCE(stock, 0) - NEW.quantity
WHERE items.iditems = NEW.iditems;
return NEW;

また、関数定義を適切に終了する必要があります。

-- ...
END;
$trigger$ language plpgsql;

CREATE TRIGGER trigger
-- ...

また、予約語を使用して問題が発生する可能性がありtriggerますfunction。トリガー名と関数名 (それぞれ) として、より適切な名前を付けるか、少なくとも二重引用符で囲むことをお勧めします。

于 2013-06-13T17:54:27.863 に答える