在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. angular6 Can't bind to 'zzst' since it isn't a known property of

    文档: https://angular.io/guide/template-syntax#event-binding The Angular compiler may reject these bin ...

  2. Linux下面kettle的部署

    一直以来服务器是linux系统,但是感觉linux图形化不强,于是从接触kettle以来都是在windows系统操作ETL的设计和处理.现在需要在linux中查看一下kettle资源库是否连接正常,以 ...

  3. sublime同步侧边栏与窗体的颜色

    Ctrl+Shift+P -> install -> 搜索安装包 SyncedSidebarBg,自动同步侧边栏底色为编辑窗口底色. P.S. 有时改完后侧边栏颜色没变化,不知什么原因,打 ...

  4. What the difference between __weak and __block reference?

    近日遇到一个非常细的知识点,关于block的循环引用问题.相比非常多人都遇到了.也能顺利攻克了,至于block方面的技术文章.那就很多其它了.这里不再赘述,可是有这样一个问题: What the di ...

  5. 免费资源:JellyFish的iOS8应用图标集

    本地下载 包含设计和PNG效果图片的iOS8的图标集合.

  6. 破解OfficeVBA密码的方法

    我自己找到一个office的VBA加密方法,然后再去找一个方法来破解密码,好像有点自相矛盾啊. 如果excel文件是xls或xlm格式(如果不是请转化成此种方法),则可使用以下代码: '移除VBA编码 ...

  7. linux上安装BeatifulSoup(第三方python库)

    1. 什么是beatifulsoup? beatifulsoup官网http://www.crummy.com/software/BeautifulSoup/ BeatifulSoup是用Python ...

  8. C++AMP介绍(一)

    C++AMP介绍(一) 最后更新日期:2014-05-02 阅读前提: 环境:Windows 8.1 64bit英文版,Visual Studio 2013 Professional Update1英 ...

  9. 算法笔记_191:历届试题 大臣的旅费(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市. 为节省经费,T国的大臣们经过思考, ...

  10. Menubar

    A menubar is a common part of a GUI application. It is a group of commands located in various menus. ...