我正在尝试使用从同一个表中查询的数据在表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不太熟练,所以我想知道是否有解决这个问题的方法。提前致谢
答案 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);