zoukankan      html  css  js  c++  java
  • MySQL 批量修改某一列的值为另外一个字段的值

    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、然后每一条记录,单独修改一次

      这样就存在一个问题,效率并不高,首先,发请求、等待数据库执行,然后在迭代下一条记录。

      然后换了一种方法,就是下面这个语句:

    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  

    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的值。更新的时候,会自动取出其中的值来进行更新。

  • 相关阅读:
    Java vs Python
    Compiled Language vs Scripting Language
    445. Add Two Numbers II
    213. House Robber II
    198. House Robber
    276. Paint Fence
    77. Combinations
    54. Spiral Matrix
    82. Remove Duplicates from Sorted List II
    80. Remove Duplicates from Sorted Array II
  • 原文地址:https://www.cnblogs.com/-beyond/p/9388252.html
Copyright © 2011-2022 走看看