MySQL从两个表中删除多个列

时间:2009-11-18 13:29:49

标签: mysql syntax join

我有两张这样的表:

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条目时,我想删除所有子类别和文档。

我该怎么做?

4 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

这是一个快速的Oracle示例:

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

答案 3 :(得分:0)

您有两种选择 - 在任何一种情况下,我都建议您为您的关系创建外键约束。

选择1是使用ON DELETE CASCADE。我认为这不是一个好习惯,因为意外删除可能会产生相当惊人的后果。

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

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