あいまいな列をテーブル修飾する必要があります。
仮想テーブル名を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ケース名を使用していません。参照: