执行Insert语句通过select查询目标表数据插入行时报错如何解决
问题原因
该报错是MySQL的特有限制:对某张表执行INSERT/UPDATE/DELETE等写操作时,不能在同级的FROM子句中直接查询这同一张表,避免出现读写冲突。
解决方案
方案1:嵌套一层临时表封装子查询
MySQL不会识别嵌套两层的子查询为直接操作目标表,修改后的SQL如下:
insert into menu(title, routerlink, icon, hassubmenu, parentid, alignement) values( 'Accès site', '/pages/reporting/accessite', 'reorder', 0, (select idmenu from (select idmenu from menu where title = 'Reporting' and parentid = 0) as temp), 0 );
原理是先把查询到的idmenu存入临时表temp中,外层再从临时表取数,避开直接从原表查询的限制。
方案2:用INSERT ... SELECT语法替代VALUES写法
直接把固定值和查询结果整合到SELECT语句中,不需要单独写子查询取值,写法更简洁:
insert into menu(title, routerlink, icon, hassubmenu, parentid, alignement) select 'Accès site', '/pages/reporting/accessite', 'reorder', 0, idmenu, 0 from menu where title = 'Reporting' and parentid = 0;
如果担心匹配到多条数据,可以在WHERE条件后加LIMIT 1限制返回行数。
内容的提问来源于stack exchange,提问作者pheromix
相关产品推荐
相关产品推荐

