MySQL 批量修改某一列的值為另外一個字段的值
1
2
3
4
5
6
7
8
9
10
11
|
mysql>
select
*
from
fruit;
+
----+--------+-------+
| id |
name
| price |
+
----+--------+-------+
| 1 | apple | 0 |
| 2 | banana | 0 |
| 3 | orange | 0 |
| 4 | mango | 0 |
| 5 | pomelo | 0 |
+
----+--------+-------+
5
rows
in
set
(0.00 sec)
|
要求很簡單,將上面fruit表的price列的值改為id列的值,比如第一條記錄的price改成1(對應id)。
剛開始,我很天真的這樣想:
1、用php或者其他的將所有記錄都取出來
2、然后每一條記錄,單獨修改一次
這樣就存在一個問題,效率並不高,首先,發請求、等待數據庫執行,然后在迭代下一條記錄。
然后換了一種方法,就是下面這個語句:
1
|
mysql>
update
fruit a
set
price = (
select
id
from
fruit b
where
a.id = b.id);
|
其實SQL語句寫的特別明白,意思也沒問題,但是,mysql不支持更改一種表,這種表就是在from子句中的表。
所以,上面報錯信息如下:
ERROR 1093 (HY000): You can't specify target table 'a' for update in FROM clause
公布答案:
直接更新price=id
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
mysql>
update
fruit
set
price=id;
Query OK, 5
rows
affected (0.00 sec)
Rows
matched: 5 Changed: 5 Warnings: 0
mysql>
select
*
from
fruit;
+
----+--------+-------+
| id |
name
| price |
+
----+--------+-------+
| 1 | apple | 1 |
| 2 | banana | 2 |
| 3 | orange | 3 |
| 4 | mango | 4 |
| 5 | pomelo | 5 |
+
----+--------+-------+
5
rows
in
set
(0.00 sec)
|
首先,我們在平常的update、insert、where篩選中,如果值的類型是字符串型,那么我們通常會使用引號將其括起來,但是我們並沒有將字段名括起來。
在上面這一條命令中,set price=id,其實id也是字段名,並不是id的值。更新的時候,會自動取出其中的值來進行更新。