SQL删除与INNER JOIN

有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"); 

在你的第一行添加.*

尝试:

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

如果数据库是InnoDB,那么使用外键和级联删除可能是一个更好的主意,这将做你想做的事情,也没有多余的数据被存储。

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

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

删除之前select行可能是一个更好的主意,所以你确定删除你想要的:

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

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

如果数据库是InnoDB,则不需要进行删除连接。 只要

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

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

 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,你可以删除像这样的logging

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

在第一行我已经初始化了两个临时表来删除logging,在第二行中,我已经将存在表分配给a和b,但是在这里我已经将两个表连接到了join关键字,并且我匹配了主键和外键对于这两个表进行链接,在最后一行我已过滤的logging按字段删除。