我有两张这样的表:
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条目时,我想删除所有子类别和文档。
我该怎么做?
答案 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的变体。