MySQL 5.5.62 UPDATE关联子查询报错目标表不可更新 需生成排序序列列
报错原因
你遇到的1288报错是MySQL 5.5版本的固有限制导致的:当UPDATE语句中关联的子查询直接读取待更新的目标表时,MySQL会判定该子查询生成的派生表不可更新,避免同表同时读写产生的逻辑冲突。你的语句里子查询q是直接从tbl_a读取数据生成的,而更新的目标表也是tbl_a,就触发了这个限制。
解决方法
你完全不需要用JOIN子查询的复杂写法,MySQL的UPDATE语句本身支持ORDER BY语法,可以直接在更新时按指定字段排序生成序列,写法更简洁,性能也更好:
-- 初始化序列变量 SET @row_number = 0; -- 按pDateHour升序更新pPrio为连续序列 UPDATE `tbl_a` SET pPrio = (@row_number := @row_number + 1) ORDER BY pDateHour ASC;
执行完上述语句后,执行查询SELECT pPrio, pDateHour FROM tbl_a ORDER BY pPrio ASC即可得到你预期的结果。
如果你一定要用JOIN子查询的写法实现,只需要在原有子查询外再套一层临时查询,绕过同表读写限制即可:
SET @row_number = 0; UPDATE `tbl_a` t JOIN ( SELECT pNum, pID FROM ( SELECT (@row_number := @row_number + 1) pNum, pID FROM `tbl_a` ORDER BY pDateHour ASC ) AS tmp ) q ON t.pID = q.pID SET t.pPrio = q.pNum;
内容的提问来源于stack exchange,提问作者Edward Sheriff Curtis
相关产品推荐
相关产品推荐

