[SQL] レコードがなければINSERT、あればUPDATEする

ここではMySQLでの実行方法を取り上げます。

構文

INSERT句で、ON duplicate key updateを利用することで実現できます。

INSERT INTO `テーブル名` (id, name) 
  VALUES (1, 'りんご')
ON duplicate key update
    id   = 1
  , name = 'ぱんだ';

ここでは次のようなテーブルを想定しています。 id列がプライマリとなりますので、idが重複するINSERT文の場合はUPDATEが実行されます。

mysql> desc test;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(64) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+

実行例

mysql> select * from test;
+----+---------+
| id | name    |
+----+---------+
|  1 | foobar  |
|  2 | katsube |
+----+---------+

mysql> INSERT INTO test (id, name) VALUES ( 1, "りんご") ON duplicate key update id=1, name="ぱんだ";                                                

mysql> select * from test;
+----+---------+
| id | name    |
+----+---------+
|  1 | ぱんだ   |
|  2 | katsube |
+----+---------+

参考

関連書籍

SQL実践入門──高速でわかりやすいクエリの書き方 (WEB+DB PRESS plus)
ミック
技術評論社
売り上げランキング: 7,281