一. 多表更新

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# 中的as和is小结

    在读.Net 框架设计的时候,关于C#中类型转化中的部分内容,在此总结记录,分享予大家. 首先,我们声明一个简单的继承关系. Class Father { Int x; } Class Child:F ...

  2. “SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之间。”

    原因: .NET中  DateTime最小值为: 0001-1-1 0:00:00 数据库中DateTime最小值为: 1753-1-1 0:00:00, 很明显:.NET中的最小值超出了数据库时间类 ...

  3. react入门(1)

    这篇文章也不能算教程咯,就算是自己学习整理的笔记把. 关于react一些相关的简介.优势之类的,随便百度一下一大堆,我就不多说了,可以去官网(http://reactjs.cn/)看一下. 这片主要讲 ...

  4. 7.10 数据注解特性--NotMapped

    NotMapped特性可以应用到领域类的属性中,Code-First默认的约定,是为所有带有get,和set属性选择器的属性创建数据列.. NotManpped特性打破了这个约定,你可以使用NotMa ...

  5. EF是啥?【What is Entity Framework?】(EF基础系列2)

    EF产生的背景: 编写ADO.NET访问数据的代码,是沉闷而枯燥的,所以微软提供了一个对象关系映射框架(我们称之为EF),通过EF可以自动帮助我们的程序自动生成相关数据库. Writing and m ...

  6. Ajax制作智能提示搜索

    一.效果图: 二.实现过程: 思路: 三.部分代码: html: <div id="searchbox"> <div><input type=&quo ...

  7. C#知识点-委托

    一.什么是委托 委托和类一样,是一种用户自定义类型: 类表示的是数据和方法的集合,而委托则持有一个或多个方法: 二.委托的使用 1.声明委托类型 委托是类型,与类一样,委托类型必须在被用来创建变量以及 ...

  8. python读取文件的方法

    一. 通过readline 逐行读取: #--encoding:utf-8 with open("ha.conf","r",encoding='utf-8') ...

  9. php实现设计模式之 适配器模式

    <?php /* * 适配器模式:将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原来由于接口不兼容而不能一起工作的那些类可以一起工作(结构型模式) * * 一个源接口,不符合 ...

  10. 新手SSH基础框架搭建

    SSH 为 struts+spring+hibernate的一个集成框架,是目前较流行的一种Web应用程序开源框架. 首先我们先了解SSH的框架所需的包和基本概念: 一.下面我们先来了解一下strut ...