首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不能在FROM子句中为update指定目标表'creature‘

不能在FROM子句中为update指定目标表'creature‘
EN

Stack Overflow用户
提问于 2016-09-05 22:55:27
回答 2查看 139关注 0票数 0

我有一个数据库,里面有游戏中的生物。

2表:

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

“生物”,包含游戏中生物的位置信息。

代码如下:

代码语言:javascript
运行
复制
    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上的所有生物,它们不是野兽(type=1)或未指定的(type=10)。

"map“列在”生物“表中,而”类型“列在"creature_template”表中。

游戏中的每个生物在数据库中都由一个ID标识。“生物”表有一个名为"id“的列,其中包含这些id,而"creature_template”表中的等价物是一个名为"entry“的列。

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

问题是,当我执行上面的代码时,我得到了这样的错误:“你不能在FROM子句中为update指定目标表'creature‘”

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

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

你知道怎么解决我的问题吗?

EN

回答 2

Stack Overflow用户

发布于 2016-09-05 23:03:31

使用“命名子查询hack":

代码语言:javascript
运行
复制
 DELETE FROM 
     creature 
    WHERE 
     id not in 
    (
     SELECT id FROM
      (
       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
      ) A
    );
票数 0
EN

Stack Overflow用户

发布于 2016-09-05 23:10:06

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

只是为了展示概念,而不是测试:

代码语言:javascript
运行
复制
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专家,但如果Mike的答案中的解决方案有效,我认为您应该使用它,因为它不涉及临时表,并且只有一条语句,而不是3条语句。当您尝试它时,它删除了您的所有行,这表明您在最里面的查询中的条件没有选择任何行,正如他所提到的。事实上,其中存在一个错误,它肯定会导致这种情况:

代码语言:javascript
运行
复制
AND a.`type` = 1 AND a.`type` = 10

将始终为false。它可能应该是

代码语言:javascript
运行
复制
AND (a.`type` = 1 or a.`type` = 10)

我上面的代码包含了这个更正,如果你使用它,请先仔细检查它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39333205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档