一. 多表更新

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. 用react的ReactCSSTransitionGroup插件实现简单的弹幕动画

    1,开始的思路 公司想做直播方面的项目,并想加入弹幕的功能,直播的页面已经作为一个组件放在了用react+redux写好的一个网站项目上.所以技术老大让我研究下如何用react实现弹幕的功能.下面我就 ...

  2. 【JUC】JDK1.8源码分析之AbstractQueuedSynchronizer(二)

    一.前言 在锁框架中,AbstractQueuedSynchronizer抽象类可以毫不夸张的说,占据着核心地位,它提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.所以很有必 ...

  3. reactjs学习之路

    正式开始react的学习 1.react中组件的首字母如果是大写就会当成自定义组件,如果是小写就会当成DOM的自带元素名.如果你自定义组件名称首字母是小写不会报错,但是无法显示. 2.自定义组件的re ...

  4. js构建ui的统一异常处理方案(一)

    从早期从事基于java的服务器端开发,再到之后从事基于web和js的ui开发,总体感觉基于web页面的ui开发远不如服务器端健壮.主要是早期ie浏览器功能太弱小,很多业务被迫放到服务器端去实现,浏览器 ...

  5. ASP.NET MVC中获取URL地址参数的两种写法

    一.url地址传参的第一种写法 1.通过mvc中默认的url地址书写格式:控制器/方法名/参数 2.实例:http://localhost:39270/RequestDemo/Index/88,默认参 ...

  6. 【原创】kafka consumer源代码分析

    顾名思义,就是kafka的consumer api包. 一.ConsumerConfig.scala Kafka consumer的配置类,除了一些默认值常量及验证参数的方法之外,就是consumer ...

  7. Get和Post区别

    1. get是从服务器上获取数据,post是向服务器传送数据.2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到.post是通过H ...

  8. css毛玻璃效果

    毛玻璃其实就是磨砂玻璃,能够模糊的看清背后的风景,让人感觉有种朦胧美,让界面看上去有些层次感. 比如: 高大上啊,接下来肯定是眼馋手痒的过程... 当然,用ps搞一个全景毛玻璃背景毫无疑问是最省事的, ...

  9. 编译可供C#调用的C/C++动态链接库dll文件

    编译可供C#调用的C/C++动态链接库dll文件,C语言控制台应用程序,探索生成dll过程 由于项目需求,需要公司另一个团队提供相关算法支持,是用C语言编译好的dll库提供给我们进行调用. 但是拿到d ...

  10. 动态加载js和css

    开发过程中经常需要动态加载js和css,今天特意总结了一下常用的方法. 1.动态加载js 方法一:动态加载js文件 // 动态加载js脚本文件 function loadScript(url) { v ...