从多个表中删除行

10

我正在尝试使用SQL从多个已连接的表中删除多行数据。

表A与表B连接, 表B与表C连接。

我想删除所有在表A中对应的表B和表C中的行。

CREATE TABLE `boards` (
  `boardid` int(2) NOT NULL AUTO_INCREMENT,
  `boardname` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY  (`boardid`)
);

-- --------------------------------------------------------

-- 
-- Table structure for table `messages`
-- 

CREATE TABLE `messages` (
  `messageid` int(6) NOT NULL AUTO_INCREMENT,
  `boardid` int(2) NOT NULL DEFAULT '0',
  `topicid` int(4) NOT NULL DEFAULT '0',
  `message` text NOT NULL,
  `author` varchar(255) NOT NULL DEFAULT '',
  `date` datetime DEFAULT NULL,
  PRIMARY KEY  (`messageid`)
);

-- --------------------------------------------------------

-- 
-- Table structure for table `topics`
-- 

CREATE TABLE `topics` (
  `topicid` int(4) NOT NULL AUTO_INCREMENT,
  `boardid` int(2) NOT NULL DEFAULT '0',
  `topicname` varchar(255) NOT NULL DEFAULT '',
  `author` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY  (`topicid`)
);
4个回答

20

如果你使用InnoDB表,你可以设置外键级联删除来自动完成所有操作。但是,如果你有使用MyISAM表的原因,你只需要使用多表删除

DELETE FROM boards, topics, messages
USING boards INNER JOIN topics INNER JOIN messages
WHERE boards.boardid = $boardid
    AND topics.boardid = boards.boardid
    AND messages.boardid = boards.boardid;

为什么要用“USING”而不是“ON”? - pingu
如果表格有超过5000万条记录怎么办? - vikram

6

2
您可以仅检查存在性。
delete from topics where boardid in (select boardid from boards)
delete from messages where boardid in (select boardid from boards)

但仅当此行为不应始终适用时,才有意义。当行为应始终适用时,请使用带有级联删除的外键实现。这在许多网站、您的帮助文件和这里都有解释。

1

从多个表中删除行可通过两种方式完成:

  • 从一个表中删除行,通过参照另一个表来确定要删除的行
  • 使用单个语句从多个表中删除行

多表删除语句可以用两种格式编写。以下示例演示了一种语法,用于从表t1中删除与表t2中id值匹配的行:

DELETE t1 FROM t1, t2 WHERE t1.id = t2.id;

第二种语法略有不同:

DELETE FROM t1 USING t1, t2 WHERE t1.id = t2.id;

要从两个表中删除匹配的记录,语句如下:

DELETE t1, t2 FROM t1, t2 WHERE t1.id = t2.id;
DELETE FROM t1, t2 USING t1, t2 WHERE t1.id = t2.id;

UPDATE和DELETE通常支持的ORDER BY和LIMIT子句在执行多表操作时不允许使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接