【问题标题】:MySQL deleting multiple columns from two tableMySQL从两个表中删除多个列
【发布时间】:2009-11-18 13:29:48
【问题描述】:

我有两个这样的表:

Table categories:
columns: id, name, parent
1, Foods, 0
2, Drinks, 0
3, FastFood, 1
4, Hamburger, 3

Table documents:
columns: id, name, categoryID
1, CheseBurger, 4
2, shop, 3

父列具有父类别的 ID。因此,当我想从类别中删除 Foods 条目时,我想删除所有子类别和文档。

我该怎么做?

【问题讨论】:

    标签: mysql syntax join


    【解决方案1】:

    如前所述,您可以使用FOREIGN KEY CONSTRAINTS 来完成这样的任务。下面是 MySQL 的新表结构,支持自动删除文档和子类别:

    CREATE TABLE categories (
       id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
       name VARCHAR(30) NOT NULL,
       parent INT(11) UNSIGNED,
       INDEX(parent),
       FOREIGN KEY (parent) REFERENCES categories(id) ON DELETE CASCADE       
    ) engine=InnoDB;
    
    CREATE TABLE documents (
       id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
       name VARCHAR(30) NOT NULL,
       categoryID INT(11) UNSIGNED NOT NULL,
       INDEX(categoryID),
       FOREIGN KEY (categoryID) REFERENCES categories(id) ON DELETE CASCADE
    ) engine=InnoDB;
    

    【讨论】:

    • 那么当我试图删除语法时应该如何?
    • INSERT INTO docs.categories ( id , name , parent ) VALUES ( NULL , 'Sample', '0' ) #1452 - 无法添加或更新子行:外键约束失败 (docs/categories, CONSTRAINT categories_ibfk_1 FOREIGN KEY (parent) REFERENCES categories (id) ON DELETE CASCADE) 我在尝试从phpMyAdmin
    • 在这种情况下,您引用的 categories.id 为 0,它不存在。这导致您的外键约束失败。对于父类别(根级别),您可能需要将此值设置为 NULL。
    • 就删除一行而言,您将执行通常的命令:DELETE FROM categories WHERE id = ?。这将触发两个表中的外键约束。
    • 哦。我想通了。那么获取根级项目的语法应该如何?
    【解决方案2】:

    我要么使用触发器,要么创建一个更详细的“删除”存储过程来处理它。

    【讨论】:

      【解决方案3】:

      一些数据库支持通过外键强制引用完整性。我用 Oracle 做过,但我不是 mysql 专家。它通过关键字'CASCADE DELETE'作为外键的属性完成。数据库会自动为您处理。

      这是一个快速的 Oracle 示例:

      ALTER TABLE Things ADD CONSTRAINT FK_Things_Stuff
          FOREIGN KEY (ThingID) REFERENCES Stuff (ThingID)
      ON DELETE CASCADE
      ;
      

      【讨论】:

        【解决方案4】:

        您有 2 个选择 - 无论哪种情况,我都建议您为您的关系创建外键约束。

        选择 1 是使用ON DELETE CASCADE。不过,我认为这不是一个好的做法,因为意外删除可能会产生非常令人惊讶的后果。

        选择 2 是遍历树并找到需要删除的记录。您可以对类别表使用自联接来标识层次结构的 n 级中的所有子项。这是我最喜欢的方法,imo。

        触发器等其他想法只是 2 的变体。

        【讨论】:

          猜你喜欢
          • 2014-02-26
          • 1970-01-01
          • 2016-06-23
          • 2011-01-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-10-01
          • 1970-01-01
          相关资源
          最近更新 更多