MySQL(Aurora)でマージ文を発行する方法

MySQL(Aurora)でマージ文を発行する方法

MySQLでマージ文を発行するにはINSERT文にON DUPLICATE KEY UPDATEキーワードを使用してマージ文を実行します。

以下のような従業員テーブルがあるとします。

CREATE TABLE `employee` (
  `id` bigint(20) NOT NULL,
  `first_name` varchar(50) DEFAULT NULL,
  `last_name` varchar(50) DEFAULT NULL,
  `height` bigint(20) DEFAULT NULL,
  `weight` bigint(20) DEFAULT NULL,
  `skill_level` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

これにマージ文を発行するには以下のようにON DUPLICATE KEY UPDATEキーワードを使用します。

INSERT INTO employee 
(id,first_name,last_name,height,weight,skill_level) 
VALUES 
(1,'高橋','K太郎',168,58,0) 
ON DUPLICATE KEY UPDATE 
height = 175, weight = 80;

このマージ文はIDがPKなので、データがなければインサート、既に存在すればアップデートを実行します。

データがなければインサート、あれば何もしない

PostgreSQL9.5からだとできるのですがMySQLでも同様の操作が出来るか調べてみました。

PostgreSQL9.5のupsertのON CONFLICT DO NOTHINGの動作確認

結論から言うとINSERT IGNORE文を使うと同様のことが可能です。

employeeテーブルのデータが以下の通りだとします。

mysql> SELECT * FROM employee;
+----+------------+-----------+--------+--------+-------------+
| id | first_name | last_name | height | weight | skill_level |
+----+------------+-----------+--------+--------+-------------+
|  1 | 高橋       | K太郎     |    168 |     58 |           0 |
|  2 | 東口       | 歩        |    170 |     70 |           1 |
+----+------------+-----------+--------+--------+-------------+
2 rows in set (0.00 sec)

この状態でinsert ignore文で既に存在するプライマリキーのデータに対してインサート文を発行してみます。

mysql> INSERT IGNORE INTO employee(id,first_name,last_name,height,weight,skill_level) values (1,'a','a',168,58,0);
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> SELECT * FROM employee;
+----+------------+-----------+--------+--------+-------------+
| id | first_name | last_name | height | weight | skill_level |
+----+------------+-----------+--------+--------+-------------+
|  1 | 高橋       | K太郎     |    168 |     58 |           0 | ←変更なし
|  2 | 東口       | 歩        |    170 |     70 |           1 |
+----+------------+-----------+--------+--------+-------------+
2 rows in set (0.00 sec)

1 warningとなっていますが、postgreSQL同様、データに変更がないことが確認できます。

UPDATE IGNORE文

更新時にもUPDATE IGNORE構文を使うことができますが、プライマリキーを更新するのは普通有り得ないので、割愛します。

コメント

株式会社CONFRAGE ITソリューション事業部をもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む

タイトルとURLをコピーしました