MySQL 批量修改某一列的值为另外一个字段的值 MySQL 批量修改某一列的值为另外一个字段的值

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 |
+ ----+--------+-------+
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 |
+ ----+--------+-------+
rows  in  set  (0.00 sec)

  

  首先,我们在平常的update、insert、where筛选中,如果值的类型是字符串型,那么我们通常会使用引号将其括起来,但是我们并没有将字段名括起来。

  在上面这一条命令中,set price=id,其实id也是字段名,并不是id的值。更新的时候,会自动取出其中的值来进行更新。

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 |
+ ----+--------+-------+
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 |
+ ----+--------+-------+
rows  in  set  (0.00 sec)

  

  首先,我们在平常的update、insert、where筛选中,如果值的类型是字符串型,那么我们通常会使用引号将其括起来,但是我们并没有将字段名括起来。

  在上面这一条命令中,set price=id,其实id也是字段名,并不是id的值。更新的时候,会自动取出其中的值来进行更新。

猜你喜欢

转载自www.cnblogs.com/chengfengchi/p/12674112.html