目次
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インフラ」
FEnetインフラはサービス開始から10年以上『エンジニアの生涯価値の向上』をミッションに掲げ、多くのエンジニアの就業を支援してきました。
転職をお考えの方は気軽にご登録・ご相談ください。