错误代码:1093。您无法指定目标表格' t'用于FROM子句中的更新

时间:2017-01-27 01:06:54

标签: mysql sql-update

update test as t 
SET t.agent=86 
where t.id in (select tgt.test_id from test_group_tests as tgt where tgt.test_id in 
(select t.id from test where t.agent in (1)) and tgt.testgroup_id not in (20,58,23,37,447));

我尝试了这个查询,我看到了这个错误。是否缺少内部联接或其他什么?

2 个答案:

答案 0 :(得分:2)

通常,MySQL不允许您在同一查询中SELECT表和UPDATE相同的表。但是,您可以通过连接表来编写多表UPDATE

我阅读您的查询的方式,似乎以下内容会做同样的事情:

UPDATE test AS t
JOIN test_group_test AS tgt ON (t.id=tgt.test_id)
JOIN test AS t2 ON (tgt.test_id=t2.id)
SET t.agent=86
WHERE t2.agent IN (1)
  AND tgt.testgroup_id NOT IN (20,58,23,37,447);

虽然我没有测试过这个查询。这是将JOIN用于多表UPDATE的示例。因此,请仔细测试,看看它是否符合您的意图,并保留原始数据的备份,以防万一。

有关MySQL中多表UPDATE的更多信息,请参阅https://dev.mysql.com/doc/refman/5.7/en/update.html

答案 1 :(得分:0)

在下面的代码中,子查询将返回不在组中的所有测试ID(20,58,23,37,447),但更新将仅更新代理在(1)中的测试记录。

update test as t 
SET t.agent=86 
where t.agent in (1)
and t.id in 
(
   select
   tgt.test_id
   from test_group_tests as tgt 
   where tgt.testgroup_id not in (20,58,23,37,447)
);