【问题标题】:SQL DELETE with INNER JOIN带有 INNER JOIN 的 SQL DELETE
【发布时间】:2012-01-25 19:04:02
【问题描述】:

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

【问题讨论】:

  • 更加惊讶,因为 L2 社区通常会保持自我。虽然阅读了这个问题并认为“看起来像......嗯......它是!”但有点奇怪。 :)
  • @Corbin 我完全明白你的意思。有趣的是,我正在就一个工作项目的 L2 问题获得帮助。

标签: mysql sql sql-server inner-join sql-delete


【解决方案1】:

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

试试:

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

【讨论】:

  • 这是我得到的错误:[Err] 1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行 [Err] DELETE l2revo.root 的“spawnlist FROM db.root.spawnlist s INNER JOIN db.root.npc n ON s.npc_t”附近使用正确的语法。 spawnlist FROM db.root.spawnlist s INNER JOIN db.root.npc n ON s.npc_templateid = n.idTemplate WHERE (n.type = "monster"); [Msg] 已完成 - 未成功 -------------------------------------------------------- ------
  • 在您的错误中,您似乎为spawnlist 使用了两个不同的服务器名称。我看到l2revo.root.spawnlistdb.root.spawnlist
  • 我只是在此处粘贴时出错,但用户名和数据库名相同,我的错误。
  • 尝试为您的别名添加AS
  • @GauravRamanan s.* 告诉 mysql 要删除什么,你不想从 JOINED 表中删除行
【解决方案2】:

如果数据库是 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

【讨论】:

  • 这是我得到的错误:[Err] 1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法以使用 near 's INNER JOIN npc n ON s.npc_templateid = n.idTemplate WHERE n.type = "monste' at line 1 [Err] DELETE FROM spawnlist s INNER JOIN npc n ON s.npc_templateid = n.idTemplate WHERE n.type = "monster"; [Msg] 完成 - 不成功 ------------------------ --------------------------
  • 改了,现在可能更成功?
  • 错误:[Err] 1066 - 不是唯一的表/别名:'npc' [Err] 从 spawnlist 中删除 spawnlist,npc INNER JOIN npc WHERE spawnlist.npc_templateid = npc.idTemplate AND npc.type = "怪物”; [Msg] 已完成 - 未成功 -------------------------------------------------------- ------
  • 如果你只运行一次,你可能会运行非常低效:DELETE FROM spawnlist WHERE npc_templateid IN (SELECT idTemplate from npc WHERE type = "monster");
  • 这是我的最后一次尝试,如果您只从一个连接表中删除,那么我看不出为什么这不起作用。
【解决方案3】:

如果数据库是 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 关键字将两个表链接在一起, 我已经为建立链接的两个表匹配了主键和外键, 在最后一行中,我按字段过滤了要删除的记录。

【讨论】:

  • type实际上是在另一个表中,而不是在spawnlist表中,所以join是必须的
猜你喜欢
  • 2012-04-02
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 1970-01-01
  • 2017-08-18
  • 2012-05-23
相关资源
最近更新 更多