SQL删除与INNER JOIN
有2个表, spawnlist
和npc
,我需要从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按字段删除。