10

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

表 A 连接到表 B 表 B 连接到表 C

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

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

4 回答 4

20

好吧,如果您使用过 InnoDB 表,则可以使用外键设置级联删除,这一切都会自动完成。但是如果你有使用 MyISAM 的原因,你只需使用多表 DELETE

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;
于 2009-04-09T14:58:33.313 回答
6

如果您使用带有“on delete cascade”的外键,这可以由您的数据库系统完成。

看看这里: http ://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

于 2009-04-09T14:54:11.703 回答
2

您可以只检查是否存在

delete from topics where boardid in (select boardid from boards)
delete from messages where boardid in (select boardid from boards)

但这只有在这种行为不应该总是适用的情况下才有意义。当行为应始终适用时,在级联上使用 delete 实现外键

在无数个网站、您的帮助文件和此处进行了解释

于 2009-04-09T15:00:11.470 回答
1

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

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

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

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 子句。

于 2014-02-24T10:12:27.447 回答