MySQLでのUPDATE文の使い方を紹介!UPDATE文を正しく使いこなそう

MySQLでのUPDATEの使い方を紹介します!
今回は、MySQLでのUPDATE文の使い方について説明します。
ここでは以下について紹介します。
・基本的な使い方
・更新レコード数を指定
・一括更新
・INSERT…ON DUPLICATE KEY UPDATE
MySQLでのUPDATE文の使い方に興味のある方はぜひご覧ください。
基本的な使い方
MySQLのUPDATE文の基本的な使い方を紹介します。
ここでは、以下のようなテーブルを使用します。
1
2
3
4
5
6
7
8
9
10
|
mysql> desc user;
+------------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| last_name | text | YES | | NULL | |
| first_name | text | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+------------+---------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
|
以下のレコードを事前にINSERTしておきます。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
mysql> SELECT * FROM user;
+----+-----------+------------+------+
| id | last_name | first_name | age |
+----+-----------+------------+------+
| 1 | taro | yamada | 30 |
| 2 | jiro | sato | 20 |
| 3 | saburo | tanaka | 36 |
| 4 | ichiro | suzuki | 28 |
| 5 | shiro | takahashi | 27 |
+----+-----------+------------+------+
5 rows in set (0.00 sec)
mysql>
|
それでは、UPDATE文の基本的な使い方を紹介します。文法は以下です。
1
2
3
|
UPDATE テーブル名
SET カラム名1 = 値1 [, カラム名2 = 値2, ...]
WHERE 条件
|
実際のSQL文を見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
mysql> UPDATE user SET age = 22 WHERE id = 1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> SELECT * FROM user WHERE id = 1;
+----+-----------+------------+------+
| id | last_name | first_name | age |
+----+-----------+------------+------+
| 1 | taro | yamada | 22 |
+----+-----------+------------+------+
1 row in set (0.00 sec)
mysql>
|
MySQLで複数カラムをUPDATEするには以下のように記述します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
mysql> SELECT * FROM user WHERE id = 2;
+----+-----------+------------+------+
| id | last_name | first_name | age |
+----+-----------+------------+------+
| 2 | jiro | sato | 20 |
+----+-----------+------------+------+
1 row in set (0.00 sec)
mysql> UPDATE user SET last_name = "hanako", first_name = "yamada" where id = 2;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> SELECT * FROM user WHERE id = 2;
+----+-----------+------------+------+
| id | last_name | first_name | age |
+----+-----------+------------+------+
| 2 | hanako | yamada | 20 |
+----+-----------+------------+------+
1 row in set (0.00 sec)
mysql>
|
更新レコード数を指定
MySQLのUPDATE文における、更新レコード数を指定する方法を紹介します。
LIMITを使用します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
mysql> SELECT * FROM user;
+----+-----------+------------+------+
| id | last_name | first_name | age |
+----+-----------+------------+------+
| 1 | taro | yamada | 22 |
| 2 | hanako | yamada | 20 |
| 3 | saburo | tanaka | 36 |
| 4 | ichiro | suzuki | 28 |
| 5 | shiro | takahashi | 27 |
+----+-----------+------------+------+
5 rows in set (0.00 sec)
mysql> UPDATE user SET age = 20 LIMIT 3;
Query OK, 2 rows affected (0.00 sec)
Rows matched: 3 Changed: 2 Warnings: 0
mysql> SELECT * FROM user;
+----+-----------+------------+------+
| id | last_name | first_name | age |
+----+-----------+------------+------+
| 1 | taro | yamada | 20 |
| 2 | hanako | yamada | 20 |
| 3 | saburo | tanaka | 20 |
| 4 | ichiro | suzuki | 28 |
| 5 | shiro | takahashi | 27 |
+----+-----------+------------+------+
5 rows in set (0.00 sec)
mysql>
|
3レコードのみ更新されていることが分かります。また、ORDER BY句と組み合わせることもできます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
mysql> SELECT * FROM user;
+----+-----------+------------+------+
| id | last_name | first_name | age |
+----+-----------+------------+------+
| 1 | taro | yamada | 20 |
| 2 | hanako | yamada | 20 |
| 3 | saburo | tanaka | 20 |
| 4 | ichiro | suzuki | 28 |
| 5 | shiro | takahashi | 27 |
+----+-----------+------------+------+
5 rows in set (0.00 sec)
mysql> UPDATE user SET age = 30 ORDER BY id DESC LIMIT 3;
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3 Changed: 3 Warnings: 0
mysql> SELECT * FROM user;
+----+-----------+------------+------+
| id | last_name | first_name | age |
+----+-----------+------------+------+
| 1 | taro | yamada | 20 |
| 2 | hanako | yamada | 20 |
| 3 | saburo | tanaka | 30 |
| 4 | ichiro | suzuki | 30 |
| 5 | shiro | takahashi | 30 |
+----+-----------+------------+------+
5 rows in set (0.00 sec)
mysql>
|
このようにMySQLでは、更新レコードの上限数を指定できます。
一括更新
MySQLでの一括更新する方法を紹介します。
実際のSQL文を見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
mysql> SELECT * FROM user;
+----+-----------+------------+------+
| id | last_name | first_name | age |
+----+-----------+------------+------+
| 1 | taro | yamada | 20 |
| 2 | hanako | yamada | 20 |
| 3 | saburo | tanaka | 30 |
| 4 | ichiro | suzuki | 30 |
| 5 | shiro | takahashi | 30 |
+----+-----------+------------+------+
5 rows in set (0.00 sec)
mysql> UPDATE user SET last_name = ELT(FIELD(id,2,4,5),'aaa','bbb','ccc') WHERE id IN (2,4,5);
Query OK, 0 rows affected (0.01 sec)
Rows matched: 3 Changed: 0 Warnings: 0
mysql> SELECT * FROM user;
+----+-----------+------------+------+
| id | last_name | first_name | age |
+----+-----------+------------+------+
| 1 | taro | yamada | 20 |
| 2 | aaa | yamada | 20 |
| 3 | saburo | tanaka | 30 |
| 4 | bbb | suzuki | 30 |
| 5 | ccc | takahashi | 30 |
+----+-----------+------------+------+
5 rows in set (0.00 sec)
mysql>
|
このようにMySQLでは、UPDATE文を複数記述しなくても、1文で複数レコードを更新できます。
INSERT…ON DUPLICATE KEY UPDATE
INSERT…ON DUPLICATE KEY UPDATE構文を使用すると、レコードがなければINSERT・あればUPDATEします。
ユニークなカラムに対してINSERT/UPDATEの判断をしますので、UNIQUEもしくは主キーを指定する必要があります。
ここでは、以下のテーブル定義とします。
1
2
3
4
5
6
7
8
9
10
11
12
|
mysql> desc user;
+------------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| last_name | text | YES | | NULL | |
| first_name | text | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+------------+---------+------+-----+---------+-------+
4 rows in set (0.01 sec)
mysql>
|
それでは実際のSQL文を見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
mysql> SELECT * FROM user;
+----+-----------+------------+------+
| id | last_name | first_name | age |
+----+-----------+------------+------+
| 1 | taro | yamada | 20 |
| 2 | aaa | yamada | 20 |
| 3 | saburo | tanaka | 30 |
| 4 | bbb | suzuki | 30 |
| 5 | ccc | takahashi | 30 |
+----+-----------+------------+------+
5 rows in set (0.00 sec)
mysql> INSERT INTO user (id, last_name, first_name, age) VALUES (1, 'hoge', 'hoge', 40) ON DUPLICATE KEY UPDATE age = 50;
Query OK, 2 rows affected (0.00 sec)
mysql> INSERT INTO user (id, last_name, first_name, age) VALUES (6, 'piyo', 'piyo', 40) ON DUPLICATE KEY UPDATE age = 50;
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM user;
+----+-----------+------------+------+
| id | last_name | first_name | age |
+----+-----------+------------+------+
| 1 | taro | yamada | 50 |
| 2 | aaa | yamada | 20 |
| 3 | saburo | tanaka | 30 |
| 4 | bbb | suzuki | 30 |
| 5 | ccc | takahashi | 30 |
| 6 | piyo | piyo | 40 |
+----+-----------+------------+------+
6 rows in set (0.00 sec)
mysql>
|
このように、MySQLでは、レコードがなければINSERT・あればUPDATEできます。
まとめ
いかがでしたでしょうか。MySQLでのUPDATE文の使い方について説明しました。
更新レコード数を指定したり、一括更新したりできます。ぜひご自身でSQL文を書いて、理解を深めてください。
FEnetを運営しているネプラス株式会社はサービス開始から10年以上
『エンジニアの生涯価値の向上』をミッションに掲げ、
多くのインフラエンジニア・ネットワークエンジニアの就業を支援してきました。
ネプラス株式会社はこんな会社です
秋葉原オフィスにはネプラス株式会社をはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
インフラ業界に特化
ネットワーク・サーバー・データベース等、ITインフラ業界に特化。Cisco Systemsプレミアパートナーをはじめ各種ベンダーのパートナー企業です。
業界を知り尽くしているからこそ大手の取引先企業、経験豊富なエンジニアに選ばれています。
-
正社員なのにフリーランスのような働き方
正社員の方でも希望を聞いたうえでプロジェクトをアサインさせていただいており、フリーランスのような働き方が可能。帰社日もありません。
プロジェクト終了後もすぐに次の案件をご紹介させていただきますのでご安心ください。
-
大手直取引の高額案件
案件のほとんどが大手SIerやエンドユーザーからの直取引のためエンジニアの皆様へに高く還元できています。
Ciscoをはじめ、Juniper、Azure、Linux、AWS等インフラに特化した常時300件以上の案件があります。
-
スキルアップ支援
不要なコストを削減し、その分エンジニアの方へのスキルアップ支援(ネットワーク機器貸出、合格時の受験費用支給など)や給与で還元しています。
受験費用例)CCNP,CCIE:6-20万円、JNCIS:3-4万円、AWS:1-3万円など
※業務に関連する一定の資格のみ。各種条件がありますので詳しくは担当者へにお尋ねください。
-
現給与を保証します!※
前職の給与保証しており、昨年度は100%の方が給与アップを実現。収入面の不安がある方でも安心して入社していただけます。
※適用にはインフラエンジニアの業務経験1年以上、等一定の条件がございます。
-
インセンティブ制度
ネットワーク機器の販売・レンタル事業等、売上に貢献いただいた方にはインセンティブをお支払いしています。
取引先企業とエンジニア側、双方にメリットがあり大変好評をいただいています。
-
社会保険・福利厚生
社員の方は、社会保険を完備。健康保険は業界内で最も評価の高い「関東ITソフトウェア健康保険組合」です。
さらに様々なサービスをお得に利用できるベネフィットステーションにも加入いただきます。
-
東証プライム上場企業グループ
ネプラスは東証プライム上場「株式会社夢真ビーネックスグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
ネプラス株式会社に興味を持った方へ
ネプラス株式会社では、インフラエンジニアを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
オンライン面接も随時受付中。ぜひお気軽にご応募ください。


MySQL新着案件New Job
-
サーバ構築・運用設計/東京都渋谷区/【WEB面談可/インフラサーバ経験者/20~40代の方活躍中】/在宅勤務
年収588万~588万円東京都渋谷区(渋谷駅) -
【高額年収】/基盤運用保守/東京都千代田区/【WEB面談可/インフラサーバ経験者/20~40代の方活躍中】/在宅勤務
年収600万~720万円東京都千代田区(溜池山王駅) -
【高額年収】/国内クラウドシステムのサーバ運用保守/東京都新宿区/【WEB面談可/インフラサーバ経験者/20~40代の方活躍中】/在宅勤務
年収600万~720万円東京都新宿区(東新宿駅) -
国内クラウドシステムのサーバ構築のテスター/東京都新宿区/【WEB面談可/インフラサーバ経験者/20~40代の方活躍中】/在宅勤務
年収300万~420万円東京都新宿区(東新宿駅) -
【高額年収】/社内情報システムインフラ運用保守/Windows/東京都多摩北部/【WEB面談可】/在宅勤務/20代~30代の方活躍中
年収600万~720万円東京都多摩北部(-駅) -
社内情報システムインフラ構築のテスター/Windows/東京都多摩北部/【WEB面談可】/在宅勤務/20代~30代の方活躍中
年収300万~420万円東京都多摩北部(-駅)