sql >> データベース >  >> RDS >> PostgreSQL

INSERT ... ON CONFLICTDOUPDATEのあいまいな列参照

    あいまいな列をテーブル修飾する必要があります。
    仮想テーブル名を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 NULLNULL + 1として まだNULL 。この設定の方が理にかなっています:

    CREATE TABLE test.test_counter (
      id    text PRIMARY KEY
    , count integer NOT NULL DEFAULT 1
    );
    

    また、私の例では引用されたCaMeLケース名を使用していません。参照:




    1. CakePHPは、データベースから最も近い緯度経度をクエリします

    2. Laravel5.2でこのクエリに条件付きを使用する方法

    3. ORA-00997の回避策:LONGデータ型の不正使用

    4. Erlang Mysql:SQLインジェクションを防ぐ方法