Mysql错误1093

时间:2015-11-13 15:37:50

标签: mysql

我正在尝试使用从同一个表中查询的数据在表Points中插入新记录,但是我收到以下错误

  

#1093 - You can't specify target table 'Points' for update in FROM clause

这是查询:

insert into Points (`userID`,`restaurantID`,`franchiseID`,`points`) 
values (16,5,1,((SELECT 
                       FORMAT(SUM(itemPrice)/10,0)  
                 FROM 
                    Orders left join Menu using(menuID) 
                 WHERE 
                    logID = 701)+
                (SELECT 
                    SUM(points) 
                 FROM 
                    Points 
                 WHERE `userID` = 16 AND `franchiseID`=1)))

我对MySQL不太熟练,所以我想知道是否有解决这个问题的方法。提前致谢

2 个答案:

答案 0 :(得分:2)

看起来MySQL不允许你这样做。我设置了一个人为的例子并得到了相同的结果:

create table blah (a bigint not null primary key auto_increment, b varchar(6));
insert into blah (b) values ('junk');

select * from blah;
+---+------+
| a | b    |
+---+------+
| 1 | junk |
+---+------+

 insert into blah (b) values ((select b from blah where a = 1));
 ERROR 1093 (HY000): You can't specify target table 'blah' for update in FROM clause

对不起,伙计!来自MySQL文档(http://dev.mysql.com/doc/refman/5.7/en/subqueries.html):

  

在MySQL中,您无法修改表并从子查询中的同一个表中进行选择。这适用于DELETE,INSERT,REPLACE,UPDATE等语句,(因为子查询可以在SET子句中使用)LOAD DATA INFILE。

Sasha Pachev的回答是一个很好的建议,但是Giorgos Betsos在对这个答案的评论中建议了一个优雅的解决方法:

insert into blah (b) values ((select b from (select b from blah where a = 1) as t));

select * from blah;
+---+------+
| a | b    |
+---+------+
| 1 | junk |
| 2 | junk |
+---+------+

通过添加带有别名的另一个子查询层,看起来MySQL在封面下创建了一个临时表,从而解决了这个限制。 (不幸的是我安装的MySQL版本不会有EXPLAIN插入,但EXPLAINing嵌套子查询会显示派生表)

答案 1 :(得分:2)

您可以将临时结果存储在用户变量中:

SET @sum_val := (SELECT 
                       FORMAT(SUM(itemPrice)/10,0)  
                 FROM 
                    Orders left join Menu using(menuID) 
                 WHERE 
                    logID = 701)+
                (SELECT 
                    SUM(points) 
                 FROM 
                    Points 
                 WHERE `userID` = 16 AND `franchiseID`=1));
insert into Points (`userID`,`restaurantID`,`franchiseID`,`points`) 
values (16,5,1,@sum_val);