web-dev-qa-db-ja.com

postgresql:ビューからの削除

Postgresql 9.4では、テーブルAとBのUNIONとしてビューを実行しており、基になるテーブルのレコードを「削除」すると、単一のDELETED N ROWSメッセージが表示されます(見る)。

詳細はこちらです。私たちの見解は、

_A
--
id, name
1, afoo
2, abar

B
--
id, name
3, bfoo
4, bbar
_

したがって、ビューCは次のようになります。

_C
--
1, afoo
2, abar
3, bfoo
4, bbar
_

CREATE TRIGGER delete_trigger INSTEAD OF DELETE C FOR EACH ROW DO delete_trigger()を実行しました。これは基本的にIDで行を削除します。

_-- our function trigger():
$$
delete from A where id=old.id;
GET DIAGNOSTICS deletedA = ROW_COUNT;

delete from B where id=old.id;
GET DIAGNOSTICS deletedB = ROW_COUNT;

raise notice 'deleted % records from A, % records from B', deletedA , deletedB;

$$
_

_delete * from C;_のようなコマンドを発行する場合、理想的な目標は、次のような単一のメッセージを持つことです。

_deleted 2 records from A, 2 records from B
_

しかし、代わりに-私たちはよく知らないので-、

_deleted 1 records from A, 0 records from B 
deleted 1 records from A, 0 records from B 
deleted 0 records from A, 1 records from B 
deleted 0 records from A, 0 records from B 
_

削除されたレコードの単一の合計を取得することは可能ですか?

これのパフォーマンスも心配です。

ありとあらゆる助けが大歓迎です!

3
arod

トリガーされたイベントは、行ごとに呼び出されます。

構文は

CREATE TRIGGER c_view_delete_trg INSTEAD OF DELETE ON c_view FOR EACH ROW EXECUTE PROCEDURE c_view_delete();

つまり、関数は削除される行ごとに1回呼び出されます。これが、1行ずつ印刷される理由です。

1
Yaki Klein