我有一个数据库,里面有游戏中的生物。
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上的所有生物,它们不是野兽(type=1)或未指定的(type=10)。
"map“列在”生物“表中,而”类型“列在"creature_template”表中。
游戏中的每个生物在数据库中都由一个ID标识。“生物”表有一个名为"id“的列,其中包含这些id,而"creature_template”表中的等价物是一个名为"entry“的列。
所以我必须做的是选择地图#571上的所有生物,然后排除所有类型1和10,并删除其余的。
问题是,当我执行上面的代码时,我得到了这样的错误:“你不能在FROM子句中为update指定目标表'creature‘”
我在这里做了一些关于stackoverflow的研究,并尝试了一些我找到的解决方案。
...I最终删除了“生物”表中的所有数据。幸运的是,我从昨天做的备份中得到了数据。
你知道怎么解决我的问题吗?
发布于 2016-09-05 23:03:31
使用“命名子查询hack":
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
);
发布于 2016-09-05 23:10:06
一种可能性是使用从creature
中提取要删除的行或要保留的行的SELECT
进行INSERT INTO a temp table (临时表只需包含PK列),并且在DELETE
语句的子查询的WHERE
中只需使用临时表。
只是为了展示概念,而不是测试:
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条语句。当您尝试它时,它删除了您的所有行,这表明您在最里面的查询中的条件没有选择任何行,正如他所提到的。事实上,其中存在一个错误,它肯定会导致这种情况:
AND a.`type` = 1 AND a.`type` = 10
将始终为false。它可能应该是
AND (a.`type` = 1 or a.`type` = 10)
我上面的代码包含了这个更正,如果你使用它,请先仔细检查它。
https://stackoverflow.com/questions/39333205
复制相似问题