你不能指定目标表'生物'用于FROM子句中的更新

时间:2016-09-05 14:55:27

标签: mysql

我有一个包含游戏中生物的数据库。

2张表:

" creature_template"包含与生物有关的所有数据

"生物"包含有关游戏中生物位置的信息。

以下是代码:

    DELETE FROM 
     creature 
    WHERE 
     id not in 
    (SELECT DISTINCT 
     b.id 
    FROM 
     creature_template a inner join creature b on a.entry = b.id 
    WHERE 
     b.map != 571 
     AND a.`type` = 1 
     AND a.`type` = 10
    );

类型是生物的类型(1 =野兽,10 =未指定)

我想要做的是删除地图#571上的所有生物,这些生物不是野兽(类型= 1)或未指定(类型= 10)。

"地图"列位于"生物"表"类型"列位于" creature_template"表。

游戏中的每个生物都通过ID在数据库中识别。 "生物" table有一个名为" id"其中包含这些ID,而#34; creature_template" table是一个名为" entry"的列。

所以我必须做的是选择地图#571上的所有生物,然后排除所有类型1和10并删除其余的生物。

问题是,当我执行上面的代码时,我收到的错误是"你不能指定目标表'生物'用于FROM子句"

的更新

我在这里做了一些关于stackoverflow的研究,并尝试了一些我找到的解决方案。

...我最终删除了"生物"中的所有数据。表。幸运的是,我从昨天做的备份中得到了数据。

知道如何解决我的问题吗?

2 个答案:

答案 0 :(得分:0)

使用“named subquery hack”:

questionRouter.post('/questionsReply', (req, res) => {
 twilioResp(req, res);
 var newResponse = new Response(req.body);
 newResponse.save((err, data) => {
  if (err) return handleDBError(err, res);
  res.status(200).json(data);
 });
 console.log('From: ' + req.body.From);
 console.log('Message: ' + req.body.Body);
});

答案 1 :(得分:0)

一种可能性是INSERT INTO a temp table使用SELECTcreature中提取要删除的行或要保留的行(临时表只需要包含PK)列),并在WHERE语句的子查询的DELETE中使用临时表。

只是为了展示这个概念,未经过测试:

SELECT DISTINCT 
     b.id
    INTO #TempRowsToKeep
    FROM 
     creature_template a inner join creature b on a.entry = b.id 
    WHERE 
     b.map != 571 
     AND (a.`type` = 1 or a.`type` = 10);

DELETE FROM 
     creature 
    WHERE 
     id not in 
      (SELECT id FROM #TempRowsToKeep);

DROP TABLE #TempRowsToKeep;

我不是MySQl专家,但如果迈克的答案解决方案有效,我认为你应该选择那个,因为它不涉及临时表,只有一个声明而不是3.当你的时候尝试它删除所有行表明你在最里面的查询中的条件没有选择任何行,如他所提到的。事实上,它确实存在一个错误:

AND a.`type` = 1 AND a.`type` = 10

总是假的。应该是

AND (a.`type` = 1 or a.`type` = 10)

我上面的代码包含此修正,如果您使用它,请先仔细检查。