一. 多表更新

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. SQL Server 存储(1/8):理解数据页结构

    我们都很清楚SQL Server用8KB 的页来存储数据,并且在SQL Server里磁盘 I/O 操作在页级执行.也就是说,SQL Server 读取或写入所有数据页.页有不同的类型,像数据页,GA ...

  2. 原来css中的border还可以这样玩

    原来css中的border还可以这样玩 前面的话: 在看这篇文章之前你可能会觉得border只是简单的绘制边框,看了这篇文章,我相信你也会跟我一样说一句"我靠,原来css中的border还可 ...

  3. .NET Core New csproj 如何发布可执行文件

    一.前言 .NET工具链在最新的Preview3版本中,引入了新的MSBuild项目系统,项目文件又回归了.csproj的XML文件来管理,项目文件.包引用.程序集引用..NET Core工具集.发布 ...

  4. using 的三种用法

    using 有哪三种用法? 1)引入命名空间. 2)给命名空间或者类型起别名. 3)划定作用域.自动释放资源,使用该方法的类型必须实现了 System.IDisposable接口,当对象脱离作用域之后 ...

  5. [Asp.net 5] DependencyInjection项目代码分析-目录

    微软DI文章系列如下所示: [Asp.net 5] DependencyInjection项目代码分析 [Asp.net 5] DependencyInjection项目代码分析2-Autofac [ ...

  6. [Asp.net 5] Logging-日志系统的基本架构(上)

    本节主要介绍解决方案中的Microsoft.Framework.Logging.Abstractions.Microsoft.Framework.Logging俩个工程. 这俩个工程中所有类的关系如下 ...

  7. SQL 性能优化-查询优化(like查询)

    废话不说,上代码 SET STATISTICS IO ON SELECT * FROM dbo.T_AssNews WHERE Content LIKE '%会%' 花费时间 执行计划 一个百分号的代 ...

  8. 基于MVC4+EasyUI的Web开发框架经验总结(16)--使用云打印控件C-Lodop打印页面或套打报关运单信息

    在最新的MVC4+EasyUI的Web开发框架里面,我整合了关于网购运单处理的一个模块,其中整合了客户导单.运单合并.到货扫描.扣仓.出仓.查询等各个模块的操作,里面涉及到一些运单套打的操作,不过由于 ...

  9. 推荐几个Web前端开发实用的Chrome插件

    越来越多的前端开发人员喜欢在Chrome里开发调试代码,Chrome有许多优秀的插件可以帮助前端开发人员极大的提高工作效率.尤其Chrome本身是可以登录的,登录后你所有的插件都会自动同步到每一个登录 ...

  10. HighchartsNET快速图表控件-开源

    前言: HighchartsNET快速图表控件,基于Highcharts的asp.net web控件.只需几行代码你就能快速生成一个图表. 从此不再担心图表复杂.简单几行代码就可以搞定,节省大量工作时 ...