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

PostgreSQLでの一括/バッチ更新/アップサート

    バルクインサート

    @Ketemaによって3列の一括挿入を変更できます:

    INSERT INTO "table" (col1, col2, col3)
      VALUES (11, 12, 13) , (21, 22, 23) , (31, 32, 33);
    

    次のようになります:

    INSERT INTO "table" (col1, col2, col3)
      VALUES (unnest(array[11,21,31]), 
              unnest(array[12,22,32]), 
              unnest(array[13,23,33]))
    

    値をプレースホルダーに置き換える:

    INSERT INTO "table" (col1, col2, col3)
      VALUES (unnest(?), unnest(?), unnest(?))
    

    このクエリの引数として配列またはリストを渡す必要があります。これは、文字列の連結を行わなくても、大量の挿入を実行できることを意味します(そして、そのすべての混乱と危険性:SQLインジェクションと引用地獄)。

    一括更新

    PostgreSQLはFROM拡張機能をUPDATEに追加しました。このように使用できます:

    update "table" 
      set value = data_table.new_value
      from 
        (select unnest(?) as key, unnest(?) as new_value) as data_table
      where "table".key = data_table.key;
    

    マニュアルには適切な説明がありませんが、postgresql-adminメーリングリストに例があります。私はそれについて詳しく説明しようとしました:

    create table tmp
    (
      id serial not null primary key,
      name text,
      age integer
    );
    
    insert into tmp (name,age) 
    values ('keith', 43),('leslie', 40),('bexley', 19),('casey', 6);
    
    update tmp set age = data_table.age
    from
    (select unnest(array['keith', 'leslie', 'bexley', 'casey']) as name, 
            unnest(array[44, 50, 10, 12]) as age) as data_table
    where tmp.name = data_table.name;
     
    

    StackExchangeには、UPDATE...FROM..を説明する他の投稿もあります。 VALUESを使用する サブクエリの代わりに句。読みやすくなるかもしれませんが、行数は固定されています。



    1. FORMAT()を使用してSQLServerの数値に条件付き書式を適用する方法

    2. FROM_DAYS()の例– MySQL

    3. SQLServerデータベースですべての外部キー制約を有効にするスクリプトを生成する方法-SQLServer/TSQLチュートリアルパート78

    4. MySQLのELT()に相当するSQL Serverは何ですか?