MySQL SELECT同时UPDATE同一张表问题发生及解决

 更新时间:2013年03月25日 11:30:42   作者:  
例如用统计数据更新表的字段(此时需要用group子句返回统计值),从某一条记录的字段update另一条记录,而不必使用非标准的语句,等等感兴趣的朋友可以参考下哈
MySQL不允许SELECT FROM后面指向用作UPDATE的表,有时候让人纠结。当然,有比创建无休止的临时表更好的办法。本文解释如何UPDATE一张表,同时在查询子句中使用SELECT.

问题描述
假设我要UPDATE的表跟查询子句是同一张表,这样做有许多种原因,例如用统计数据更新表的字段(此时需要用group子句返回统计值),从某一条记录的字段update另一条记录,而不必使用非标准的语句,等等。举个例子:
复制代码 代码如下:

create table apples(variety char(10) primary key, price int);
insert into apples values('fuji', 5), ('gala', 6);
update apples
set price = (select price from apples where variety = 'gala')
where variety = 'fuji';

错误提示是:ERROR 1093 (HY000): You can't specify target table 'apples' for update in FROM clause. MySQL手册UPDATE documentation这下面有说明 : “Currently, you cannot update a table and select from the same table in a subquery.”
在这个例子中,要解决问题也十分简单,但有时候不得不通过查询子句来update目标。好在我们有办法。

解决办法
既然MySQL是通过临时表来实现FROM子句里面的嵌套查询,那么把嵌套查询装进另外一个嵌套查询里,可使FROM子句查询和保存都是在临时表里进行,然后间接地在外围查询被引用。下面的语句是正确的:
复制代码 代码如下:

update apples
set price = (
select price from (
select * from apples
) as x
where variety = 'gala')
where variety = 'fuji';

如果你想了解更多其中的机制,请阅读MySQL Internals Manual相关章节。

没有解决的问题
一个常见的问题是,IN()子句优化废品,被重写成相关的嵌套查询,有时(往往?)造成性能低下。把嵌套查询装进另外一个嵌套查询里并不能阻止它重写成相关嵌套,除非我下狠招。这种情况下,最好用JOIN重构查询(rewrite such a query as a join)。

另一个没解决的问题是临时表被引用多次。“装进嵌套查询”的技巧无法解决这些问题,因为它们在编译时被创建,而上面讨论的update问题是在运行时。

相关文章

  • MySQL数据库完全备份与增量备份详解

    MySQL数据库完全备份与增量备份详解

    这篇文章主要介绍了MySQL数据库完全备份与增量备份详解,完全备份就是将数据库中的数据及所有对象全部备份,具体详细内容需要的朋友可以参考一下
    2022-08-08
  • mysql优化之慢查询分析+explain命令分析+优化技巧总结

    mysql优化之慢查询分析+explain命令分析+优化技巧总结

    这篇文章主要介绍了mysql优化之慢查询分析,explain命令分析,优化技巧总结,需要的朋友可以参考下
    2023-02-02
  • MySQL两种临时表的用法详解

    MySQL两种临时表的用法详解

    这篇文章主要介绍了MySQL两种临时表的用法详解,.内容比较详细,这里分享给大家,供大家参考,学习。
    2017-10-10
  • 你知道mysql中空值和null值的区别吗

    你知道mysql中空值和null值的区别吗

    这篇文章主要给大家介绍了关于mysql中空值和null值区别的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 将MySQL的临时目录建立在内存中的教程

    将MySQL的临时目录建立在内存中的教程

    这篇文章主要介绍了将MySQL的临时目录建立在内存中的教程,以获得不关机情况下的高性能使用,需要的朋友可以参考下
    2015-04-04
  • MySQL数据库的高可用方案总结

    MySQL数据库的高可用方案总结

    这篇文章主要针对MySQL数据库的高可用方案进行详细总结,高可用架构对于互联网服务基本是标,本文是对各种方案的总结,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • 高效的mysql分页方法及原理

    高效的mysql分页方法及原理

    这篇文章介绍了高效的mysql分页方法及原理,有需要的朋友可以参考一下
    2013-08-08
  • MySQL 5.7.27下载安装配置的详细教程

    MySQL 5.7.27下载安装配置的详细教程

    这篇文章主要介绍了MySQL 5.7.27详细下载安装配置教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • MySQL基于索引的压力测试的实现

    MySQL基于索引的压力测试的实现

    本文主要介绍了MySQL基于索引的压力测试的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • MySQL如何计算连续登录天数

    MySQL如何计算连续登录天数

    这篇文章主要介绍了MySQL如何计算连续登录天数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05

最新评论