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構文を使うことができますが、プライマリキーを更新するのは普通有り得ないので、割愛します。
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント