【问题标题】:delete rows from multiple tables从多个表中删除行
【发布时间】:2009-04-09 14:50:43
【问题描述】:

我正在尝试使用 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`)
);

【问题讨论】:

    标签: mysql delete-row sql-delete


    【解决方案1】:

    好吧,如果您使用过 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;
    

    【讨论】:

    • 为什么是“使用”而不是“开启”?
    • 如果表超过50M条记录怎么办?
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      你可以只检查是否存在

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

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

      在无数网站、您的帮助文件和here中进行了解释

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2016-02-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多