同様の動作を実現するためにルールを使用することをお勧めしました。 この場合、ルールを使用することはMERGEよりも優れているように思われ、ルールを作成し...落とし穴に遭遇しました。 カウンターを実装しました。一意のキーがあり、新しいレコードが挿入されるときにそのようなキーが既にテーブルに存在する場合は、代わりにカウンター値を増やします。
シンプルな状況、シンプルなルール。 しかし、最初の挿入時に、このルールが判明しましたが、うまくいきました! その結果、最初の挿入では1が挿入されず、2が挿入されます。
執筆中に、 Fred84はこの状況を詳細に説明するリンクを投げました: archives.postgresql.org/pgsql-bugs/2007-03/msg00080.php
#CREATE TABLE x(id INT NOT NULL、counter INT NOT NULL DEFAULT 0、PRIMARY KEY(id)); #ルールxxx ASを作成または置換 xへの挿入時 WHERE(EXISTS(SELECT x.id xから WHERE x.id = new.id))DO INSTEAD UPDATE x SET counter = x.counter + 1 WHERE x.id = new.id; #INSERT INTO x VALUES(1、1); #select * from x; id | カウンター ---- + --------- 1 | 2
ご覧のとおり、counter = 2ですが、物事の論理によると1でなければなりません。