あいまいな列をテーブル修飾する必要があります。
仮想テーブル名をexcluded
で使用します。 入力行を参照します。ただし、おそらくターゲット列を参照する必要があるため、ターゲットテーブルの名前で修飾します。
INSERT INTO test.test_counter (id)
VALUES ('id-0')
ON CONFLICT (id) DO UPDATE
SET count = test_counter.count + 1 -- here
RETURNING count;
仮想入力テーブルの単一行excluded
すべてが含まれています INSERT
のターゲット列リストにリストされていない場合でも、ターゲットテーブルの列 またはVALUES
表現。したがって、count
であるかどうかに関係なく、遭遇したあいまいさは常に存在します。 明示的にターゲットにされているかどうか。
余談:ターゲット列リストで省略された列は、デフォルトでそれぞれの列DEFAULT
になります NULL
である値 デフォルト(NULL
デフォルトの列DEFAULT
)。つまり、デフォルトでNULL
になります セットアップと1
以下の私の改善されたセットアップで。そして、行レベルのトリガーBEFORE INSERT
(もしあれば)適用されます。
ただし、 target を参照しているため、この例にはどちらも当てはまりません。 結局のところ、列。
特に、列名count
の他の2つのインスタンス ターゲットのみを参照できるため、明確です(したがって、テーブル修飾は必要ありません)。 テーブル。
列count
の実行中に、セットアップが簡単に壊れることがあります 定義されていませんNOT NULL
、NULL + 1
として まだNULL
。この設定の方が理にかなっています:
CREATE TABLE test.test_counter (
id text PRIMARY KEY
, count integer NOT NULL DEFAULT 1
);
また、私の例では引用されたCaMeLケース名を使用していません。参照: