便利クエリ(INSERT ~ ON DUPLICATE KEY UPDATE)

「INSERT … ON DUPLICATE KEY UPDATE 構文」を利用すると、該当レコードが存在しないときはINSERTを行い、存在する場合はUPDATEしてくれます。ここでは、「INSERT … ON DUPLICATE KEY UPDATE 構文」の動作確認を行います。

動作確認

下記テーブルに対して動作確認します。

mysql> SHOW COLUMNS FROM `users`;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(100) | NO   |     | NULL    |                |
| old   | int(11)      | NO   |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

レコードが存在しないとき

mysql> SELECT * FROM users;
Empty set (0.00 sec)

mysql> 
mysql> INSERT INTO `users` 
    ->     (`id`, `name`, `old`) 
    -> VALUES 
    ->     (1, "aaa", 24)
    -> ON DUPLICATE KEY UPDATE
    ->     `name` = VALUES(`name`),
    ->     `old` = VALUES(`old`);
Query OK, 1 row affected (0.00 sec)

mysql> 
mysql> SELECT * FROM users;
+----+------+-----+
| id | name | old |
+----+------+-----+
|  1 | aaa  |  24 |
+----+------+-----+
1 row in set (0.00 sec)

レコードが挿入されました。

レコードが存在するとき

mysql> SELECT * FROM users;
+----+------+-----+
| id | name | old |
+----+------+-----+
|  1 | aaa  |  24 |
+----+------+-----+
1 row in set (0.00 sec)

mysql> 
mysql> 
mysql> 
mysql> INSERT INTO `users` 
    ->     (`id`, `name`, `old`) 
    -> VALUES 
    ->     (1, "bbb", 62)
    -> ON DUPLICATE KEY UPDATE
    ->     `name` = VALUES(`name`),
    ->     `old` = VALUES(`old`);
Query OK, 2 rows affected (0.00 sec)

mysql> 
mysql> SELECT * FROM users;
+----+------+-----+
| id | name | old |
+----+------+-----+
|  1 | bbb  |  62 |
+----+------+-----+
1 row in set (0.00 sec)

レコードが更新されました。

CASE文の利用

CASE文も利用可能です。

mysql> SELECT * FROM users;
| id | name | old |
+----+------+-----+
|  1 | bbb  |  62 |
+----+------+-----+
1 row in set (0.00 sec)

mysql> 
mysql> INSERT INTO `users` 
    ->     (`id`, `name`, `old`) 
    -> VALUES 
    ->     (1, "ccc", -10)
    -> ON DUPLICATE KEY UPDATE
    ->     `name` = VALUES(`name`),
    ->     `old` = (CASE WHEN values(`old`) < 0
    ->                   THEN 0 
    ->                   ELSE values(`old`) 
    ->              END);
Query OK, 2 rows affected (0.00 sec)

mysql> SELECT * FROM users;
+----+------+-----+
| id | name | old |
+----+------+-----+
|  1 | ccc  |   0 |
+----+------+-----+
1 row in set (0.00 sec)

mysql> INSERT INTO `users` 
    ->     (`id`, `name`, `old`) 
    -> VALUES 
    ->     (1, "ccc", 40)
    -> ON DUPLICATE KEY UPDATE
    ->     `name` = VALUES(`name`),
    ->     `old` = (CASE WHEN values(`old`) < 0
    ->                   THEN 0 
    ->                   ELSE values(`old`) 
    ->              END);
Query OK, 2 rows affected (0.00 sec)

mysql> 
mysql> SELECT * FROM users;
+----+------+-----+
| id | name | old |
+----+------+-----+
|  1 | ccc  |  40 |
+----+------+-----+
1 row in set (0.00 sec)

参考・関連

【エンジニア向け】仕事を見つける方法

転職する

転職エージェントを活用する

転職サイトの場合、自身でサイト上から企業を探す必要があります。 一方「レバテックキャリア」 などの転職エージェントの場合、エージェントが企業を紹介してくれます。エージェントが間に入ることにより、日程調整や、条件交渉などもサポートしてくれます。

転職ドラフトを活用する

転職ドラフト」は、 企業がITエンジニアをドラフトという形で指名するサービスです。年収が最初に提示されるなどのメリットがあります。 ただ、初回登録時にレジュメ作成が必要で、すでにエンジニア経験が豊富にあるエンジニア向けのサービスかと思います。 レジュメ作成が手間ですが、自身のキャリアを見直す機会になり、他の仕事探しにも役立つはずです。

エンジニア転職保証のあるスクールを活用する

ある程度、開発経験のあるかたであれば、独学で必要なスキルを身につけることができるはずです。ただ、別業種からエンジニアに転職したい場合など、1から独学で学ぶのはハードルが高いです。そういった方は、スクールの活用を検討しても良いと思います。 「TechAcademy」は、エンジニア転職保証コースを提供しています。給付金制度の対象講座として認定されているため、金銭面の負担も抑えることができます。

フリーランスとして活動する

レバテックフリーランス」「ITプロパートナーズ」「ギークスジョブ」は、フリーランスエージェントサービスです。 エージェントによって、支払いサイトなど細かい違いはありますが、まずは良い案件を見つけることが重要です。 登録自体は無料なので、複数エージェントに登録して、より多くの案件を紹介してもらうのがおすすめです。

logo
わくわくBank.
技術系の記事を中心に、役に立つと思ったこと、整理したい情報などを掲載しています。