首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SQL DELETE with SQL

SQL DELETE with SQL
EN

Stack Overflow用户
提问于 2011-12-22 10:25:23
回答 3查看 225.1K关注 0票数 135

有两个表,spawnlistnpc,我需要从spawnlsit中删除数据。npc_templateid = n.idTemplate是唯一“连接”这些表的东西。我试过这个脚本,但它不起作用。

我已经尝试过了:

代码语言:javascript
复制
DELETE s FROM spawnlist s
INNER JOIN npc n ON s.npc_templateid = n.idTemplate
WHERE (n.type = "monster");
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-22 10:34:07

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

尝试:

代码语言:javascript
复制
DELETE s.* FROM spawnlist s
INNER JOIN npc n ON s.npc_templateid = n.idTemplate
WHERE (n.type = "monster");
票数 245
EN

Stack Overflow用户

发布于 2011-12-22 10:28:59

如果数据库是InnoDB,那么在delete时使用外键和级联可能是一个更好的主意,这将做您想要做的事情,并且不会存储冗余数据。

但是,对于这个示例,我认为您不需要前几个s:

代码语言:javascript
复制
DELETE s 
FROM spawnlist AS s 
INNER JOIN npc AS n ON s.npc_templateid = n.idTemplate 
WHERE n.type = "monster";

在删除之前选择行可能是更好的做法,这样您就可以确定要删除的内容:

代码语言:javascript
复制
SELECT * FROM spawnlist
INNER JOIN npc ON spawnlist.npc_templateid = npc.idTemplate
WHERE npc.type = "monster";

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

票数 14
EN

Stack Overflow用户

发布于 2013-02-18 15:00:05

如果数据库是InnoDB,则不需要在删除时进行联接。仅限

代码语言:javascript
复制
DELETE FROM spawnlist WHERE spawnlist.type = "monster";

可以用来删除所有与其他表中的外键链接的记录,为此,你必须在设计时先链接你的表。

代码语言:javascript
复制
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,则可以像这样删除连接的记录

代码语言:javascript
复制
DELETE a,b
FROM `spawnlist` a
JOIN `npc` b
ON a.`npc_templateid` = b.`idTemplate`
WHERE a.`type` = 'monster';

在第一行中,我初始化了两个用于删除记录的临时表,在第二行中,我将existance表分配给了a和b,但在这里,我使用join关键字将这两个表链接在一起,并且我匹配了两个表的主键和外键,最后一行我通过字段过滤了要删除的记录。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8598791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档