sql 同时(更新)update和(查询)select同一张表
2018-03-15 18:17
2011 查看
当要使用本表的数据更新本表时,容易出错:
如下:
update b
set aaa=select max(MAX_def_60M) as max from b
[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select max(MAX_def_60M) as max from b' at line 2
解决办法:再嵌套一层查询update b
set aaa=
(select max
from
(select max(MAX_def_60M) as max from b) as temp
)不能同时读写的原因:mysql读写锁锁定的问题
若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
写锁:若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。
加了共享锁的对象,可以继续加共享锁,不能再加排它锁。加了排它锁后,不能再加任何锁。
那么说我在更新一个表的时候,我锁定了一行,这一行我是不能加读锁的了,所以这时我查询这张表,就会出现这种问题。
加一层子查询之后成功的原因(待补充):
mysql在from子句中遇到子查询时,先执行子查询并将结果放到一个临时表中,我们通常称它为“派生表”;临时表是没有索引、无法加锁的。
如下:
update b
set aaa=select max(MAX_def_60M) as max from b
[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select max(MAX_def_60M) as max from b' at line 2
解决办法:再嵌套一层查询update b
set aaa=
(select max
from
(select max(MAX_def_60M) as max from b) as temp
)不能同时读写的原因:mysql读写锁锁定的问题
若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
写锁:若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。
加了共享锁的对象,可以继续加共享锁,不能再加排它锁。加了排它锁后,不能再加任何锁。
那么说我在更新一个表的时候,我锁定了一行,这一行我是不能加读锁的了,所以这时我查询这张表,就会出现这种问题。
加一层子查询之后成功的原因(待补充):
mysql在from子句中遇到子查询时,先执行子查询并将结果放到一个临时表中,我们通常称它为“派生表”;临时表是没有索引、无法加锁的。
相关文章推荐
- Mysql update语句赋值嵌套select,更新和查询同一张表,必须取别名;用例:更新指定游戏服务器最后启动记录的结束时间
- oracle update select (更新查询的sql)
- 【转】PL/SQL编辑数据"这些查询结果不可更新,请包括ROWID或使用SELECT...FOR UPDATE获得可更新结果"处理
- PL/SQL编辑数据"这些查询结果不可更新,请包括ROWID或使用SELECT...FOR UPDATE获得可更新结果"处理
- UPDATE一张表,同时在查询子句中使用SELECT问题
- (转)PL/SQL编辑数据"这些查询结果不可更新,请包括ROWID或使用SELECT...FOR UPDATE获得可更新结果"处理
- PL/SQL编辑数据"这些查询结果不可更新,请包括ROWID或使用SELECT...FOR UPDATE获得可更新结果"处理
- SQL_4th_插入insert、查询select、删除delete、更新update
- MariaDB 10.3 解决掉了UPDATE不支持同一张表的子查询更新
- MySQL数据库同时查询更新同一张表的方法
- 【EXCEL】 EXCEL VBA SQL UPDATE:操作必须使用一个可更新的查询
- MySQL SELECT同时UPDATE同一张表问题发生及解决
- MySQL SELECT同时UPDATE同一张表
- T-SQL(标准数据库查询语句) 在SQL Server 2008 下面的 Create、Update,Delete、Select
- mysql 各种级联查询后更新(update select)
- mysql update select 从查询结果中更新数据
- SQL 子查询之查询所有主表的数据同时统计另一张表的与主表关联的数据
- MySQL SELECT同时UPDATE同一张表
- update中加入select 完成查询更新
- SQL中Update...Select...的使用,关联查询后进行更新数据