【发布时间】:2019-05-07 14:28:32
【问题描述】:
我正在使用(在 SQL 中)DELETE 和多个 SELECTs,但我得到一个外键不匹配。
SQL 语句为:
DELETE FROM tile_items
WHERE tile_id IN (SELECT id
FROM tiles
WHERE house_id IN (SELECT id
FROM houses
WHERE owner <> 0
AND owner NOT IN (SELECT id FROM players)))
但我得到一个错误
外键不匹配 - “tile_items”引用“tiles”
奇怪的是,同样的语句,但使用SELECT * FROM,而不是DELETE FROM,会返回所有44条匹配记录。
我也尝试在字段前包含表名,但我得到了同样的错误。
DELETE FROM tile_items
WHERE tile_items.tile_id IN (SELECT id
FROM tiles
WHERE tiles.house_id IN (SELECT id FROM houses
WHERE houses.owner <> 0
AND houses.owner NOT IN (SELECT id FROM players)))
不确定是否需要,但这里是表格:
CREATE TABLE "tile_items"
(
"tile_id" INTEGER NOT NULL,
"world_id" INTEGER NOT NULL DEFAULT 0,
"sid" INTEGER NOT NULL,
"pid" INTEGER NOT NULL DEFAULT 0,
"itemtype" INTEGER NOT NULL,
"count" INTEGER NOT NULL DEFAULT 0,
"attributes" BLOB NOT NULL,
UNIQUE ("tile_id", "world_id", "sid"),
FOREIGN KEY ("tile_id") REFERENCES "tiles" ("id")
)
CREATE TABLE "tiles"
(
"id" INTEGER NOT NULL,
"world_id" INTEGER NOT NULL DEFAULT 0,
"house_id" INTEGER NOT NULL,
"x" INTEGER NOT NULL,
"y" INTEGER NOT NULL,
"z" INTEGER NOT NULL,
UNIQUE ("id", "world_id"),
FOREIGN KEY ("house_id", "world_id") REFERENCES "houses" ("id", "world_id")
)
由于错误仅引用了“tile_items”和“tiles”表,因此仅发布了这些架构。
希望有人能解释为什么我不能用这个语句删除但可以选择,谢谢。
【问题讨论】:
-
在查看许多谷歌的错误消息的许多答案中的所有案例时,您学到了什么?
-
好吧@philipxy,我以为我没有清楚正确地指定要删除的字段,所以我收到了错误,但正如 Kostya 指出的那样,这是关于需要在 CASCADE 上使用 DELETE .所以我会尝试改变我的表来添加它。将尽快发布结果。
-
请在代码问题中给出minimal reproducible example--剪切&粘贴&运行代码;具有期望和实际输出的示例输入(包括逐字错误消息);明确的规范和解释。这包括您可以提供的最少代码,即您显示的代码可以通过您显示的代码扩展为不可以。 (调试基础。)您的 DBMS 是什么?您的“tile_items”FK 声明是非法的标准/通用 SQL,甚至在您运行 select 或 delete 之前——没有 PK/UNIQUE“tiles”(“id”)可供参考。你真的有选择运行吗?阅读 FK 声明。
-
您应该始终使用您正在使用的 DBMS 标记 SQL 问题。我想这是 SQLite?
标签: sql foreign-keys