带有INNER JOIN的SQL DELETE

Joi*_*nOG 116 mysql sql sql-server inner-join sql-delete

有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");
Run Code Online (Sandbox Code Playgroud)

Thi*_*iff 210

添加.*s第一行.

尝试:

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

  • @GauravRamanan s.*告诉mysql要删除什么,你不想从JOINED表中删除行 (4认同)

Dan*_*Dan 11

如果数据库是InnoDB,那么在删除时使用外键和级联可能是更好的主意,这可以做你想要的,也不会导致存储冗余数据.

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

DELETE s 
FROM spawnlist AS s 
INNER JOIN npc AS n ON s.npc_templateid = n.idTemplate 
WHERE n.type = "monster";
Run Code Online (Sandbox Code Playgroud)

在删除之前选择行可能是一个更好的主意,因此您确定删除了您想要的内容:

SELECT * FROM spawnlist
INNER JOIN npc ON spawnlist.npc_templateid = npc.idTemplate
WHERE npc.type = "monster";
Run Code Online (Sandbox Code Playgroud)

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


Ayl*_*spa 6

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

DELETE FROM spawnlist WHERE spawnlist.type = "monster";
Run Code Online (Sandbox Code Playgroud)

可以用来删除所有与其他表的外键链接的记录,这样做,你必须先挂在设计时你的表.

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;
Run Code Online (Sandbox Code Playgroud)

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

DELETE a,b
FROM `spawnlist` a
JOIN `npc` b
ON a.`npc_templateid` = b.`idTemplate`
WHERE a.`type` = 'monster';
Run Code Online (Sandbox Code Playgroud)

在第一行我初始化了两个临时表来删除记录,在第二行我已经将存在表分配给a和b但是在这里我已经将两个表与join关键字链接在一起,并且我匹配了主键和外键对于生成链接的两个表,在最后一行我已按字段过滤记录以删除.