带有内部连接的 SQL 删除

有2个表,spawnlistnpc,我需要从 spawnlsit删除数据。 npc_templateid = n.idTemplate是唯一能够“连接”这些表的东西。 我已经试过这个脚本,但它不工作。

我试过这个:

DELETE s FROM spawnlist s
INNER JOIN npc n ON s.npc_templateid = n.idTemplate
WHERE (n.type = "monster");
236163 次浏览

如果数据库是 InnoDB,那么使用外键并级联删除可能是一个更好的主意,这将做您想做的事情,也不会导致存储冗余数据。

然而,对于这个例子,我认为你不需要第一个 s:

DELETE s
FROM spawnlist AS s
INNER JOIN npc AS n ON s.npc_templateid = n.idTemplate
WHERE n.type = "monster";

在删除之前选择行可能是一个更好的主意,这样你就可以确定你要删除的内容:

SELECT * FROM spawnlist
INNER JOIN npc ON spawnlist.npc_templateid = npc.idTemplate
WHERE npc.type = "monster";

您还可以在这里检查 MySQL delete 语法: http://dev.mysql.com/doc/refman/5.0/en/delete.html

在第一行中将 .*添加到 s

试试:

DELETE s.* FROM spawnlist s
INNER JOIN npc n ON s.npc_templateid = n.idTemplate
WHERE (n.type = "monster");

如果数据库是 InnoDB,则不需要执行连接删除操作

DELETE FROM spawnlist WHERE spawnlist.type = "monster";

可以用来删除与其他表中的外键链接的所有记录,要做到这一点,必须在设计时首先链接表。

CREATE TABLE IF NOT EXIST spawnlist (
npc_templateid VARCHAR(20) NOT NULL PRIMARY KEY


)ENGINE=InnoDB;


CREATE TABLE IF NOT EXIST npc (
idTemplate VARCHAR(20) NOT NULL,


FOREIGN KEY (idTemplate) REFERENCES spawnlist(npc_templateid) ON DELETE CASCADE


)ENGINE=InnoDB;

如果你使用 MyISAM 你可以删除这样加入的记录

DELETE a,b
FROM `spawnlist` a
JOIN `npc` b
ON a.`npc_templateid` = b.`idTemplate`
WHERE a.`type` = 'monster';

在第一行中,我初始化了两个临时表,用于删除记录, 在第二行,我给 a 和 b 赋予了存在表,但在这里,我用 join 关键字将两个表连接起来, 我已经匹配了两个表的主键和外键, 在最后一行,我按字段过滤了要删除的记录。