MySQL数据库同时查询更新同一张表的方法

在平常的项目中,经常会碰到这样的问题:我需要在一张标中同时更新和查询出来的数据。例如:有如下图一张表数据,现在需要更新操作为:把status=1的name值更新为id=2的name值

通常情况下我们会想到如下语句来实现这个需求:

UPDATE tb_testSET NAME = ( SELECT NAME FROM tb_test WHERE id= 2)WHERE `status` = 1

结果却报错,报错信息为:You can't specify target table 'tb_test' for update in FROM clause,不能在同一语句中update,select同一张表。不能在同一张表操作,换个思路,如果不是同一张表的话应该就是可以的。于是,可以把select出来的结果当成一个临时的中间表,从中间表中获取想要的更新相关的数据。于是,上面的更新语句可以更改成下面这样子:

UPDATE tb_testSET NAME = (select name from ( SELECT NAME FROM tb_test WHERE id = 2) as t)WHERE `status` = 1

这样就可以完成题目中的操作。经历的大致过程为:查询出id=2的数据作为中间表t;set的数据从t表中查询出来;做更新操作这样就不是在同一语句中update,select同一张表了,因为这相当与在操作两张表,tb_test和中间表t。最后的结果如下图:

(0)

相关推荐

  • Win7系统下mysql 5.7.11安装教程详解

    操作系统:win7 64位旗舰版 mysql压缩包:mysql-5.7.11-winx64.zip 1. 解压MySQL压缩包 将下载的MySQL压缩包解压到自定义目录下,我的解压目录是: "D:\Program Files\mysql-5.7.11-winx64" 将解压目录下默认文件 my-default.ini 拷贝一份,改名 my.ini 复制下面的配置信息到 my.ini 保存 #如果没有my-default.ini,可自己新建my.ini或者从其他地方中获取 #######

  • 在CMD中操作mysql数据库出现中文乱码解决方案

    百度了一下..有说将cmd字符编码用chcp命令改为65001(utf8字符编码),可这样之后根本无法输入中文,查询出的中问结果依旧乱码 . 其实,只要保证cmd客户端和MySQL两者编码一致即可. 但现实是cmd默认的是gbk(cmd属性可以看到中文操作系统下面是gbk编码),而mySQL一般是utf8(我的也是),之前一直进入误区,想要更改cmd的字符编码,可是并不能行得通.网友中提到在mysql中关于客户端编码问题,只需在cmd里告诉mysql服务器我客户端这边编码和想要的结果集编码即可.

  • 详解 Mysql查询结果顺序按 in() 中ID 的顺序排列

    详解 Mysql查询结果顺序按 in() 中ID 的顺序排列 实例代码: <select id="queryGBStyleByIDs" resultMap="styleMap"> select style_num_id ,style_id,style_title,style_pic FROM gb_style where online = 1 AND is_hide = 0 and style_num_id in <foreach collecti

  • Mysql常用运算符与函数汇总

    我们先把数据表建好 use test; create table `employee`( emp_no int unsigned, emp_name varchar(30), emp_sex varchar(3), emp_age tinyint unsigned, sal double, history datetime ); insert into employee values(1, '张三', '男', 18, 5000, '2012-04-23'), (2, '李四', '男', 27

  • MySQL中MIN()函数的使用教程

    MySQL的MIN函数是用来找出一个记录集最小值的记录. 要了解MIN函数考虑的EMPLOYEE_TBL表具有以下记录: mysql> SELECT * FROM employee_tbl; +------+------+------------+--------------------+ | id | name | work_date | daily_typing_pages | +------+------+------------+--------------------+ | 1 | J

  • MySQL适配器PyMySQL详解

    本文我们为大家介绍 Python3 使用 PyMySQL连接数据库,并实现简单的增删改查. 什么是 PyMySQL? PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb. PyMySQL 遵循 Python 数据库 API v2.0 规范,并包含了 pure-Python MySQL 客户端库. PyMySQL 安装 在使用 PyMySQL 之前,我们需要确保 PyMySQL 已安装. PyMySQL 下载地址:https:

  • MYSQL实现添加购物车时防止重复添加示例代码

    前言 最近因为工作的原因,在做APP购物车下单支付这一块儿.被测试提了一个bug,当点加入购物车点的比较快的时候,同一个商品在购物车中出现了两个. 因为加入购物车的时候,分2步, 第1步是先判断要加入购物车的商品是不是已经在购物车当中了,如果在的话就在原来的数量基础上做加一操作.如果不在再插件. 因为两步不是原子的操作,所以就出现了多线程的安全问题,下面话不多说了,来跟随小编一起来看看详细的解决过程吧,会对你有一定的帮助的. MySQL insert有一个比较高级的操作 示例代码: INSERT

  • php mysql PDO 查询操作的实例详解

    php mysql PDO 查询操作的实例详解 <?php $dbh = new PDO('mysql:host=localhost;dbname=access_control', 'root', ''); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $dbh->exec('set names utf8'); /*添加*/ //$sql = "INSERT INTO `user` SET `log

  • MySQL数据库同时查询更新同一张表的方法

    在平常的项目中,经常会碰到这样的问题:我需要在一张标中同时更新和查询出来的数据.例如:有如下图一张表数据,现在需要更新操作为:把status=1的name值更新为id=2的name值 通常情况下我们会想到如下语句来实现这个需求: UPDATE tb_testSET NAME = ( SELECT NAME FROM tb_test WHERE id= 2)WHERE `status` = 1 结果却报错,报错信息为:You can't specify target table 'tb_test'

  • 在Oracle数据库中同时更新两张表的简单方法

    以前只会写一些简单的updaet语句,比如updae table set c1='XXX' 之类的 今天遇到一个数据订正的问题,项目背景如下,有个表A,有两个字段a1,a2还有一个关联表B,其中也有两个字段,b1和b2.其中a2和b2是关联的,想把A中的字段a1更新成B中的b1 理论上sql应该挺好写的,但是在oralce中实现了半天一直报语法错误.而且确实还有些小小细节没有注意到. 首先上测试数据 表1,ZZ_TEST1 表2,ZZ_TEST2 要把表一的text更新成表二的text1值,对应

  • mysql实现查询数据并根据条件更新到另一张表的方法示例

    本文实例讲述了mysql实现查询数据并根据条件更新到另一张表的方法.分享给大家供大家参考,具体如下: 原本的数据库有3张表 travel_way :旅游线路表,存放线路的具体信息 traveltag :线路标签表,存放线路目的地等信息 tagrelation:标签对应表,存放线路和目的地的对应关系 因为业务逻辑的改变,现在要把它们合并为一张表,把traveltag中的目的地信息插入到travel_way中. 首先获取到所有线路对应的目的地,以线路ID分组,合并目的地到一行,以逗号分隔. 复制代码

  • MySQL数据库高级查询和多表查询

    MySQL多表查询 添加练习表 -- 用户表(user) CREATE TABLE `user`( `id` INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户id(主键)', `username` VARCHAR(50) COMMENT '用户姓名', `age` CHAR(3) COMMENT '用户年龄' ); -- 订单表(orders) CREATE TABLE `orders`( `id` INT AUTO_INCREMENT PRIMARY KEY

  • MySQL数据库SELECT查询表达式解析

    数据的管理在很大一部分是在进行查找工作,而SELECT占据了很大的一部分 SELECT select_expr [,select_expr...] [ FROM table_reference WHERE [where_condition] [GROUP BY {col_name | position} [ASC| DESC],...] [HAVING where_condition] [ORDER BY {col_name | expr |position} [ASC| DESC],...]

  • MySQL数据库子查询语法规则详解

    目录 子查询简介 WHERE 子查询 FROM 子查询 SELECT 子查询 子查询是在查询语句里面再嵌套一个查询,这是因为我们在提取数据的时候有很多不知道的数据产生了依赖关系.此时我们就需要先查询一组数据的结果集,然后将这个结果集作用为下一个查询的对象.在 “表连接的章节”,我们曾说过子查询的效率低下的问题,其实并不是所有的子查询效率都是低下的,“WHERE” 子查询在匹配记录的时候要反复执行,这是不推荐使用的:但是如果将查询结果集当做一张表来使用,与其他的表做一个连接,这就是 “FROM”

  • mysql用一个表更新另一个表的方法

    Solution 1:  修改1列 update student s, city c set s.city_name = c.name where s.city_code = c.code; Solution 2:  修改多个列 update  a,  b set a.title=b.title, a.name=b.name where a.id=b.id Solution 3: 采用子查询 update student s set city_name = (select name from c

  • java实现连接mysql数据库单元测试查询数据的实例代码

    1.按照javaweb项目的要求逐步建立搭建起机构,具体的类包有:model .db.dao.test; 具体的架构详见下图: 2.根据搭建的项目架构新建数据库test和数据库表t_userinfo并且添加对应的测试数据; (这里我使用的是绿色版的数据库,具体的下载地址:http://pan.baidu.com/s/1mg88YAc) 具体的建立数据库操作详见下图: 3.编写包中的各种类代码,具体参考代码如下: UserInfo.java /** * FileName: UserInfo.jav

  • 仅用一句SQL更新整张表的涨跌幅、涨跌率的解决方案

    问题场景 各大平台店铺的三项评分(物流.服务.商品)变化情况: 商品每日价格的变化记录: 股票的实时涨跌浮: 复现场景 表:主键ID,商品编号,记录时的时间,记录时的价格,创建时间. 问题:获取每个商品每次的变化情况(涨跌幅.涨跌率). 解决思路 1.要想高效率的更新涨跌,就肯定不能是逐条数据更新,要通过自连表建立起对应关系,将每一条数据关联到上一次的价格数据. 2.由于数据库非常庞大,所以可能存在很多垃圾数据,就比如说相关的字段值为NULL或者非有效值的,这些数据要先排除掉. SELECT i

  • mysql数据库入门第一步之创建表

    创建数据库 右键-新建数据库 输入库名.选择字符集和排序规则,点确定 创建数据库成功 新建表 my-表-右键-新建表 如上图所示,在第一个标签页"栏位"中 名:字段的名字 类型:字段的类型,有几十种,常用的有以下几种 char,可以存定长的字符串 varchar,可以存变长的字符串(定长和变长的区别在长度中介绍) int,可以存-2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 之间的数字 datetime,可以存日期类型的数据 长度:数

随机推荐