首先查询可以这样写,没毛病的
SELECT * from a LIMIT 1000,2000
1.然后看一个不是区间的limit,更新满足条件的前1000条,没问题
update a set a.imp_date = 4 where a.is_sync = 0 limit 1000
2.这样写是错误的
update a set a.imp_date = 4 where a.is_sync = 0 limit 1001,2000
原因应该是update的时候的行锁问题,跟update语句后面不能跟 SELECT同一张表的数据 是一个原因
也就是这样是不行的
UPDATE tb_name SET column_name='test' WHERE id in (SELECT id FROM tb_name ORDER BY id ASC LIMIT 20,10);
但是可以这样,这种两层子查询的话会生成临时表(在内存里多存了一份数据),所以对于mysql来说更新的不是同一张表
UPDATE tb_name SET column_name='test' WHERE id in (SELECT id FROM (SELECT * FROM tb_name ORDER BY id ASC LIMIT 20,10) AS tt);
上面1.的话加锁就是加前1000行
2.加锁估计很难实现,所以不支持
https://blog.csdn.net/qq_15071263/article/details/79001487
标签:name,update,limit,mysql,tb,id,SELECT From: https://www.cnblogs.com/onlyzhangmeng/p/17407037.html