在MySQL中使用update语句的时候,Where条件或者值都可以使用子查询,比如:

UPDATE table_a SET name=(SELECT name FROM table_b WHERE id=1)
WHERE id IN (SELECT id FROM table_c WHERE age > 24);

但是如果子查询和更新的表是同一个表的话,MySQL会报如下的错误:中涉及到的子查询要格外注意

Error Code : 1093
You can't specify target table 'table_a' for update in FROM clause

我们平时更新数据时候常见的就有如下几种:

1、最简单的语句如下:

1、UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value';
2、UPDATE mytable SET myfield = 'value' WHERE other_field in ('other_values');

2、将同一个表中的一个字段的值复制给另一个字段,常见操作如下:

1、UPDATE t_user  SET signed_time = create_time
2、UPDATE table_a SET A=(SELECT B FROM (SELECT * FROM table_a) b WHERE b.id = table_a.id)
3、update tbl_user_info_copy as aa, tbl_user_info_copy as bb
set aa.userId = bb.id
WHERE aa.id = bb.id;

3、将同一个表中两个类型一样的字段的值互换(有待完善)

UPDATE t_user u1, t_user u2
SET u1.signed_time = u2.create_time,
u2.create_time = u1.signed_time

4、一个表的某个字段赋值给另一个表的某个字段

UPDATE tbl_a, tbl_b
SET tbl_a.nick = tbl_b.userName
WHERE tbl_b.userId=tbl_b.id;
UPDATE tbl_a
inner JOIN tbl_b
on tbl_a.userId=tbl_b.id
SET tbl_a.nick=tbl_a.userName;

5、多表关联Update

update table_1 set score = score + 5 where uid in (select uid from table_2 where sid = 10);

其实update也可以用到left join、inner join来进行关联,可能执行效率更高,把上面的sql替换成join的方式如下:

update table_1 t1 inner join table_2 t2 on t1.uid = t2.uid set score = score + 5 where t2.sid = 10;

6、同时更新多个表

UPDATE tbl_a,tbl_b
SET tbl_a.nick=tbl_b.userName,tbl_b.nick = tbl_b.nick + "11"
WHERE tbl_a.userId = tbl_b.id;

或者使用join

UPDATE tbl_a
INNER JOIN
tbl_b
ON tbl_a.userId=tbl_b.id
SET tbl_a.nick=tbl_b.userName,tbl_b.nick=tbl_b.nick+ "11";

下面举例如下:

假定目前有两张表goodsgoods_price表,前者是保存商品的具体信息,后者是保存商品的价格,具体的表结构如下:

create table goods (
`id` int unsigned primary key auto_increment,
`goods_name` varchar(30) not null default '',
`deleted_at` int unsigned default null
)engine innodb charset utf8;
create table goods_price (
`goods_id` int unsigned not null,
`price` decimal(8,2) not null default '0.00'
)engine innodb charset utf8;
insert into goods (id,goods_name) values (1,'商品1'),(2,'商品2'),(3,'商品3'),(4,'商品4'),(5,'商品5');
insert into goods_price values (1,'5.44'),(2,'3.22'),(3,'5.55'),(4,'0.00'),(5,'4.54');

在update时使用逗号分割更新

将未删除的商品的价格*0.5,具体SQL语句如下:

UPDATE goods as g , goods_price as p SET p.price = p.price*0.5 WHERE p.goods_id = g.id AND g.deleted_at is null;

使用inner join更新数据

UPDATE goods g INNER JOIN goods_price p ON g.id=p.goods_id SET p.price=p.price*0.5 where g.deleted_at is null;

更新多个表

上面的更新语句使用另一个表的条件,更新一张表,也可以更新多个表。具体SQL语句如下:

UPDATE goods g INNER JOIN goods_price p on g.id=p.goods_id set p.price=p.price*0.5,g.deleted_at=unix_timestamp(now()) where g.is_deleted_at is null;

参考:

1、https://blog.csdn.net/fansunion/article/details/52130365

2、https://www.kancloud.cn/curder/mysql/355258

mysql update常见实例的更多相关文章

  1. 查询执行成本高(查询访问表数据行数多)而导致实例 CPU 使用率高是 MySQL 非常常见的问题

    MySQL CPU 使用率高的原因和解决方法_产品性能_常见问题_云数据库 RDS 版-阿里云 https://help.aliyun.com/knowledge_detail/51587.html ...

  2. 3、mysql的多实例配置(1)

    3.1.什么是mysql多实例: 3.2.mysql多实例的作用和问题: 3.3.mysql多实例生产应用的场景: 1.资金紧张的公司: 2.并发访问并不是很大的业务: 3.门户网站应用mysql多实 ...

  3. MySQL:常见使用问题

    内容 1.Linux 上安装 MySQL 2.单机上安装多实例 3.不知root密码情况下,修改root密码 1.Linux 上安装MySQL 安装步骤: 1)解压 tar.gz文件 -linux-g ...

  4. MySQL UPDATE

    MySQL UPDATE 查询 如果我们需要修改或更新MySQL中的数据,我们可以使用 SQL UPDATE 命令来操作.. 语法 以下是 UPDATE 命令修改 MySQL 数据表数据的通用SQL语 ...

  5. MySQL UPDATE 查询

    MySQL UPDATE 查询 如果我们需要修改或更新MySQL中的数据,我们可以使用 SQL UPDATE 命令来操作.. 语法 以下是 UPDATE 命令修改 MySQL 数据表数据的通用SQL语 ...

  6. mysql触发器trigger 实例详解

    mysql触发器trigger 实例详解 (转自 https://www.cnblogs.com/phpper/p/7587031.html)   MySQL好像从5.0.2版本就开始支持触发器的功能 ...

  7. mysql update 忘加 where 文件恢复

    前提条件:mysql :data_row_format=rowmysql> show variables like '%image%';+------------------+-------+| ...

  8. MySQL 触发器简单实例 - 转载

    MySQL 触发器简单实例 触发器:可以更新,删除,插入触发器,不同种类的触发器可以存在于同一个表,但同种类的不能有多个.一个更新.一个删除是可以共存的. ~~语法~~ CREATE TRIGGER  ...

  9. 十四、MySQL UPDATE 查询

    MySQL UPDATE 查询 如果我们需要修改或更新 MySQL 中的数据,我们可以使用 SQL UPDATE 命令来操作.. 语法 以下是 UPDATE 命令修改 MySQL 数据表数据的通用 S ...

随机推荐

  1. nginx rewrite only specific servername to https

    需求: 把某个域名的80端口服务  ----> 重定向转到 这个域名的 443端口的服务.   server { listen 80; server_name xxx.abcd.com.cn; ...

  2. cognos report上钻下钻报表处理方法(2)

    在此之前已经说过了在报表本身单个维度上面的上钻与下钻,本次说的是传递参数追溯到其他报表.比如从部门追溯到部门每一位员工的数据分析, 如图:报表1 点击信托业务一总部跳转到下面的报表2,显示每一位执行经 ...

  3. 独立开发人员低成本推广APP的18条技巧

    导语:知道并不等于运行,有些最主要的推广方法往往会被忽略.这些,是自国外开发人员总结出的这18条经验. 如今市面上充满了大牌子大公司和大制作的手机游戏,常常有游戏花300万成本开发,然后再花2000万 ...

  4. Shell程序荟萃

    --------------纯输出----------------1.sh #!/bin/sh echo -e "Hello!world!\a\n"exit 0 --------- ...

  5. SQLServer 之 树查询

    一.SqlServer树查询 1.使用公用表表达式(CTE) 很多人可能想要查询整个树形表关联的内容都会通过循环递归来查...事实上在微软在SQL2005或以上版本就能用别的语法进行查询,下面是示例. ...

  6. Jmeter相关

    关于Jmeter,这里有一篇文章可以看看:http://www.cnblogs.com/TankXiao/p/4045439.html 给有需要的同学.

  7. Oracle多行记录合并自定义函数

    在oracle数据库中,进行字段合并,可以使用wm_concat(column)函数,但是在这种方法不被Oracle所推荐,因为WMSYS用户用于Workspace Manager,其函数对象可能因版 ...

  8. Linux RAID简介

    现代磁盘的缺陷:IO性能极弱,稳定性极差 RAID廉价磁盘冗余阵列:通过多磁盘并行运行来提高计算机的IO性能,在创建RAID时要求硬盘大小.品牌.型号一样 RAID可分为多种,称之为RAID级别,现代 ...

  9. JavaSE入门学习17:Java面向对象之package(包)

           一Java包(package)        为了更好地组织类,Java提供了包机制,用于差别类名的命名空间.        包的作用:        A把功能类似或相关的类或接口组织在 ...

  10. JqGrid获得所有选中行数据ID数组,获取所有行的ID数组

    获得选中行的ID数组:var ids = $("jqgridtableid").jqGrid('getGridParam','selarrrow'); 获得所有行的ID数组:var ...