17/04/14

mysqlでアップサートを行う(INSERT…ON DUPLICATE KEY UPDATE文)


 

今回はレコードがないならばインサート、あるならばアップデートを行なっていきます。
UNIQUEもしくはPRIMARY KEYに重複するか判断します。

構文

— カラム a が UNIQUE として宣言され、値1を含んでいる場合、
— 次の 2 つのステートメントには同様の効果があります。

INSERT INTO table (a,b,c) VALUES (1,2,3)
    ON DUPLICATE KEY UPDATE c=c+1;

UPDATE table SET c=c+1 WHERE a=1;

引用元: MySQL 5.6 リファレンスマニュアル

 

以下からは titleカラムがuniqueインデックスとして解説していきます。

一行のアップサート

INSERT INTO Test (title, count)
VALUES ("Hello", 1)
ON DUPLICATE KEY UPDATE count = count + 2;

この場合は
テーブルにHelloがなかった場合、Helloと1をインサートします。
テーブルにHelloがあった場合、count+2となるようにcountをアップデートします。

複数行のアップサート

INSERT INTO Test (title, count)
VALUES ("Hello", 1),("GoodBye", 2)
ON DUPLICATE KEY UPDATE count = count + 10;

一行のアップサートで行われた処理を、繰り返し、アップサートします。

注意点

仮にuniqueインデックスとprimary keyが指定されていないカラムを選択した場合、
挙動が正しくならないので注意してください。

INSERT INTO Test (title, count)
VALUES ("Hello", 1)
ON DUPLICATE KEY UPDATE count = count + 2;

レコードにHelloが入っていたとしても、unique index かつ primary keyが設定されていないので、(“Hello”,1)がインサートされます。

 

実際に実行するのはこちらから
必要ない部分はコメントアウトしてください

 

 

以上です。

 

参考記事
MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.5.3 INSERT … ON DUPLICATE KEY UPDATE 構文

 

スポンサーリンク

メールアドレスが公開されることはありません。

youya66

だらけとびびり、それとちょっぴりのてきとーさ。

コアラになってだらだらしながら愛されたい。