【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 在庫数 = 在庫数 + 入庫.入庫数
で行けるようです。
似てながら微妙に違う。