有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");
答案 0 :(得分:196)
在第一行中将.*
添加到s
。
尝试:
DELETE s.* FROM spawnlist s
INNER JOIN npc n ON s.npc_templateid = n.idTemplate
WHERE (n.type = "monster");
答案 1 :(得分:10)
如果数据库是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删除语法:http://dev.mysql.com/doc/refman/5.0/en/delete.html
答案 2 :(得分:6)
如果数据库是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关键字链接在一起, 我已经匹配两个表链接的主键和外键, 在最后一行我已按字段过滤记录以删除。