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

view raw
employee
hosted with ❤ by GitHub

これにマージ文を発行するには以下のように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;

view raw
merge
hosted with ❤ by GitHub

このマージ文は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)

view raw
select
hosted with ❤ by GitHub

この状態で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)

view raw
insert ignore
hosted with ❤ by GitHub

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

UPDATE IGNORE文

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

  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA