LoginSignup
0
0

More than 3 years have passed since last update.

PostgreSQLでテーブル間でUPSERTを行う

Last updated at Posted at 2019-08-07

【PostgreSQL】テーブル間でUPSERT

在庫マスタ ( 商品コード, 在庫数 ) <- 商品コードが主キー

のようなテーブルを

入庫 ( 商品コード, 入庫数 )

のテーブルのデータで 更新したい場合の話です。
試したのがPostgreSQL 11.2

Oracle, DB2, SQL ServerはMERGE文をお使いください。
細かいところで記述の仕方が異なるところ、動作の違いがそれぞれありますが。

【結論】


INSERT INTO 在庫マスタ
    SELECT * FROM 入庫
    ON CONFFLICT( 商品コード ) DO UPDATE
        SET 在庫数 = 在庫マスタ.在庫数 + EXCLUDED.在庫数

注意点

PostgreSQLの場合、UPDATEのSETの左辺についてはテーブル修飾は不可です。
( SQL規格上UPDATE文はそのように規定されている )

SET 在庫マスタ.在庫数 = 在庫マスタ.在庫数 + EXCLUDED.在庫数

とは記述できません。
他方

SET 在庫数 = 在庫数 + EXCLUDED.在庫数

もエラーになります。

あと、
EXCLUDED.在庫数

EXCLUDED.入庫数

ではないのに注意。
(最初MERGE文からの類推でうまく動かずはまりました)

MySQLの場合

INSERT INTO 在庫マスタ
    SELECT * FROM 入庫
    ON DUPLICATE KEY
        UPDATE 在庫数 = 在庫数 + 入庫.入庫数

で行けるようです。
似てながら微妙に違う。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0