MySQL中You can't specify target table '表名'('sn_app_label') for update in FROM clause错误解决办法

在有些时候有级联关系的数据放在了同一张表中,在写sql语句的时候可能会遇到这样的场景:我要插入两条数据,第一条是父节点,第二条是子节点,关联关系是父节点的自增长id;在写这样的sql语句时有可能就会出现You can't specify target table '表名' for update in FROM clause这种错误,意思就是:“不能先select出同一表中的某些值,再update这个表(在同一语句中)。”产生这个错误的sql如下:

INSERT INTO sn_app_label (app_code,apply_id,apply_name,level_id,parent_id,state,operation_time)
VALUES('CS001' ,'G001','门店属性标签','0' ,'','0','2018-06-15 00:00:00');

INSERT INTO sn_app_label (app_code, apply_id, apply_name, level_id, parent_id , state, operation_time) 
VALUES ('CS001', '001', '门店类型', '0',  (SELECT auto_id FROM sn_app_label WHERE app_code = 'CS001' AND apply_id = 'G001')  , '0', '2018-06-15 00:00:00');

 

sql错误位置为:

 

解决方法:既然不能在同一张表中,那么就使用中间表,即先select出所需要的字段auto_id,把auto_id放到一个中间表中,再从中间表中取出这auto_id;

正确sql如下

INSERT INTO sn_app_label (app_code,apply_id,apply_name,level_id,parent_id,state,operation_time)
VALUES('CS001' ,'G001','门店属性标签','0' ,'','0','2018-06-15 00:00:00');

INSERT INTO sn_app_label (app_code, apply_id, apply_name, level_id, parent_id , state, operation_time) 
VALUES ('CS001', '001', '门店类型', '0', (SELECT a.auto_id FROM(SELECT auto_id FROM sn_app_label WHERE app_code = 'CS001' AND apply_id = 'G001')a), '0', '2018-06-15 00:00:00');

错误位置修改为:

注:以上只针对MySQL

 

posted @ 2018-06-23 10:25  nihao小树苗  阅读(252)  评论(0编辑  收藏  举报