一. 多表更新

1. 数据准备

mysql> mysql> select goods_id, goods_name,goods_cate from tdb_goods;

+----------+---------------------------------------+---------------------+

| goods_id | goods_name                            | goods_cate          |

+----------+---------------------------------------+---------------------+

|        1 | R510VC 15.6英寸笔记本                 | 笔记本              |

|        3 | G150TH 15.6英寸游戏本                 | 游戏本              |

|        4 | X550CC 15.6英寸笔记本                 | 笔记本              |

|        7 | SVP13226SCB 13.3英寸触控超极本        | 超级本              |

|        9 | iPad Air MD788CH/A 9.7英寸 WiFi版     | 平板电脑            |

|       10 | iPad mini ME279CH/A 7.9英寸           | 平板电脑            |

|       14 | AT7-7414LP 台式电脑                   | 台式机              |

|       15 | Z220SFF F4F06PA工作站                 | 服务器/工作站       |

|       16 | PowerEdge T110 II服务器               | 服务器/工作站       |

+----------+---------------------------------------+---------------------+

mysql> mysql> select *db_goods_cates;

+---------+---------------------+

| cate_id | cate_name           |

+---------+---------------------+

|       1 | 台式机              |

|       2 | 平板电脑            |

|       3 | 服务器/工作站       |

|       4 | 游戏本              |

|       5 | 笔记本              |

|       6 | 超级本              |

+---------+---------------------+

2. 将tdb_goods表中的goods_cate字段更新为tdb_goods_cates表的cate_id字段

  UPDATE tdb_goods g INNER JOIN tdb_goods_cates c ON g.goods_cate = c.cate_name SET g.goods_cate = c.cate_id;

二. 更新过滤条件中包含自身的表

1. 数据准备

-----------------------------------------------------------------------------

mysql> select * from student;

+----+--------+----------+---------+

| id | name   | idCardNo | isCadre |

+----+--------+----------+---------+

|  1 | Tom    | 350020   |    NULL |

|  2 | Jim    | 350022   |    NULL |

|  3 | Lucy   | 460311   |    NULL |

|  4 | Liming | 733098   |    NULL |

+----+--------+----------+---------+

mysql> select * from cadre;

+----+--------+----------+

| id | name   | idCardNo |

+----+--------+----------+

|  1 | Tom    | 350020   |

|  2 | Max    | 636095   |

|  3 | Liming | 733098   |

+----+--------+----------+

2. 假设需要将student表中 与cadre表idCardNo字段相同的记录的isCadre更新为1

  通常我们会这样写:

  UPDATE student SET isCadre=1 WHERE student.idCardNo IN

      (SELECT s.idCardNo FROM student s INNER JOIN cadre c ON s.idCardNo=c.idCardNo);

  但是在MySQL中执行报错,“ERROR 1093 (HY000): You can't specify target table 'student' for update in FROM clause”,MySQL不支持这种过滤条件中包含自身的更新(Oracle可以)。

  正确的做法如下:

  UPDATE student a JOIN (SELECT s.idCardNo FROM student s INNER JOIN cadre c ON s.idCardNo=c.idCardNo) b

  ON a.idCardNo = b.idCardNo SET a.isCadre = 1;

  

MySQL 更新语句技巧的更多相关文章

  1. MYSQL SQL语句技巧初探(一)

    MYSQL SQL语句技巧初探(一) 本文是我最近了解到的sql某些方法()组合实现一些功能的总结以后还会更新: rand与rand(n)实现提取随机行及order by原理的探讨. Bit_and, ...

  2. mysql 更新 语句中 的 safe_mode

    在mysql5中,可以设置safe mode,比如在一个更新语句中UPDATE table_name SET bDeleted=0;执行时会错误,报:You are using safe update ...

  3. Mysql sql语句技巧与优化

    一.常见sql技巧 1.正则表达式的使用 2.巧用RAND()提取随机行 mysql数据库中有一个随机函数rand()是获取一个0-1之间的数,利用这个函数和order by一起能够吧数据随机排序, ...

  4. 【大厂面试04期】讲讲一条MySQL更新语句是怎么执行的?

    流程图 这是在网上找到的一张流程图,写的比较好,大家可以先看图,然后看详细阅读下面的各个步骤. 执行流程: 1.连接验证及解析 客户端与MySQL Server建立连接,发送语句给MySQL Serv ...

  5. mysql 更新语句中加判断条件

    UPDATE loan_overdue_list l setl.type_status=(CASE WHEN l.overdue_days>(select c.overdue_one from ...

  6. mysql sql语句使用技巧

    mysql更新数据限制limitmysql更新时,要更新记录中某个区间的数据,只能用WHERE条件来限制了,用LIMIT只能限制更新多少条!测试如下:UPDATE products SET goods ...

  7. 【MySQL 读书笔记】当我们在执行更新语句的时候我们在做什么

    该篇其实重点涉及两个日志的使用和处理. 一个是 server 层的 binlog 一个是服务器层的 redolog. 首先还是根据主线来介绍当我们在执行更新语句的时候我们在做什么 Redo Log M ...

  8. mysql实战45讲读书笔记(二) 一条SQL更新语句是如何执行的 极客时间

    前面我们系统了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块.相信你还记得,一条查询语句的执行过程一般是经过连接器.分析器.优化器.执行器等功能模块,最后到达存储引擎. 那么,一条更新语 ...

  9. 《Mysql 一条 SQL 更新语句是如何执行的?(Redo log)》

    一:更新流程 - 对于更新来说,也同样会根据 SQL 的执行流程进行. -  - 连接器 - 连接数据库,具体的不做赘述. - 查询缓存 - 在一个表上有更新的时候,跟这个表有关的查询缓存会失效. - ...

随机推荐

  1. C#二进制流的序列化和反序列化

    public class BinaryHelper { /// <summary> /// 将对象序列化为byte[] /// 使用IFormatter的Serialize序列化 /// ...

  2. 简述ASP.NET MVC原理

    1.为什么ASP.NET需要MVC? 因为随着网站的的数量级越来越大,原始的网站方式,这里指的是WebForm,在运行速度和维护性方面,以及代码量上面,越来越难以满足日益庞大的网站维护成本.代码的重构 ...

  3. Java类初始化

    Java类初始化 成员变量的初始化和构造器 如果类的成员变量在定义时没有进行显示的初始化赋值,Java会给每个成员变量一个默认值 对于  char.short.byte.int.long.float. ...

  4. (转载)构建public APIs与CORS

    from: https://segmentfault.com/a/1190000000709909 理由:在操作层面详细的讲解了跨域的操作.尤其是对于option请求的详解.收藏. 在构建Public ...

  5. javabean和jsp动作元素

    model1就是利用了jsp和javabean 的组合来处理问题.jsp页面如果有太多的逻辑代码的话,维护起来和扩展起来是相当的麻烦的.所以jsp的逻辑代码部分都打包到一种java类当中进行编写.这种 ...

  6. Myeclipse 的hadoop环境搭建

    https://issues.apache.org/jira/secure/attachment/12460491/hadoop-eclipse-plugin-0.20.3-SNAPSHOT.jar ...

  7. JAVA 8 Streams

    什么是Stream 首先要说的是,不要被它的名称骗了,这里的Stream跟JAVA I/O中的InputStream和OutputStream是两个不同的概念.Java 8中的Stream其实是函数式 ...

  8. 《Ext JS模板与组件基本框架图----组件》

    本节主要从七个方面讲解组件,组件时什么,它的作用,它的构架,以及怎么创建和周期还有常见的配置项,属性方法和事件以及其层级是什么都进行整理,希望对大家有帮助. 组件的基础知识.png 2 Abstrac ...

  9. ABP中使用Redis Cache(2)

    上一篇讲解了如何在ABP中使用Redis Cache,虽然能够正常的访问Redis,但是Redis里的信息无法同步更新.本文将讲解如何实现Redis Cache与实体同步更新.要实现数据的同步更新,我 ...

  10. 取消IE提示下载安全提问

    需求:在企业访问内部WEB系统下载文件时,IE总会弹出安全提问,征得用户同意后弹出下载保存框.现用户需要点击下载后,直接弹出下载保存框. 方案:这涉及IE安全定义问题,进行相关设置即可.方法如下: