从多个表中删除行

时间:2009-04-09 14:50:44

标签: mysql delete-row sql-delete

我正在尝试使用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 个答案:

答案 0 :(得分:18)

好吧,如果你使用过InnoDB表,你可以设置cascading delete with foreign keys来自动完成所有操作。但如果你有使用MyISAM的原因,你只需使用multiple-table 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;

答案 1 :(得分:6)

如果您使用带有“on delete cascade”的外键,则可以通过db-system完成此操作。

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

答案 2 :(得分:2)

您可以选择是否存在

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

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

在zali网站上,在您的帮助文件和here

中进行了解释

答案 3 :(得分: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子句。