挿入 …戻る ..BEFORE トリガーがステートメントをキャンセルすると空になります

StackOverflow https://stackoverflow.com//questions/24046173

質問

基本的に挿入をサブテーブルにリダイレクトする、作成時の PostgreSQL before insert トリガーがあります。レコードを挿入したら、データの重複を避けるために(親テーブルに挿入しないことで)リクエストを中止したいので、トリガーで return NULL を使用しています。問題は、ID を取得するためにレコードを返す必要があることです。NULL を返すと、NULL が返されます。

上記の問題については、以下のリンクで説明されています。PostgreSQL トリガーが何も返さない

答えの 1 つは、(null を返さずに new を返すことで) 親テーブルに挿入し、AFTER 挿入トリガーを使用して親テーブルから削除することを示しています。しかし、1 秒あたり 1000 件の書き込みが発生すると考えられており、削除によりパフォーマンスに重大な問題が発生する可能性があります。他にこれを行う方法はありますか?

正確には、親テーブルに挿入して後で削除せずに、挿入された行のIDを返す方法はあります。

役に立ちましたか?

解決

私が書いた あなたが言及している答え. 。すでに示唆したように、次のようになります。

を使用することもできます RULE ... INSTEAD .. この目的のために。

RULE

ルール 難しいかもしれません。可能であればトリガーを使用したいと思います。 必ず少し読んでください, 、これを試す前に:

CREATE OR REPLACE RULE tbl_ins AS
ON INSERT TO tbl
DO INSTEAD
INSERT INTO tbl2 (col1, col2, ...)  -- just do mention columns where ...
VALUES (NEW.col1, NEW.col2, ...)    -- ... you want to insert column defaults
RETURNING tbl2.*

それはから値を返します tbl2 幻の行を避けながら。 しかし, のドキュメントごとに CREATE RULE:

のルールでは、 INSERT, UPDATE, 、 または DELETE ビューに、 RETURNING ビューの列を出力する句。この句は、ルールがによってトリガーされた場合に出力を計算するために使用されます INSERT RETURNING, UPDATE RETURNING, 、 または DELETE RETURNING それぞれコマンドを実行します。ルールを指定しないコマンドによってルールがトリガーされた場合 RETURNING, 、 ルール RETURNING 句は無視されます。 現在の実装は無条件のみを許可します INSTEAD 含めるルール RETURNING;

太字で強調したのは私です。
あなたが言及したので、 sub-tables, 、インサートを配布するには条件が必要だと思います...

currval() / lastval()

トリガーで操作する場合 FOR EACH ROW シーケンスから適切な値を簡単にフェッチできます。 currval() / lastval(). 。難しいのは、トリガー関数からこれらの値を返すことです。一時テーブルに書き込むことしか考えられません。いつ作成し、いつ削除するかを考える必要があります...

おそらくそうするだろう アプローチ全体を再考する データを複数のデータにリダイレクトします INSERT 実際のターゲットテーブルへのステートメント ...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top