2009-11-18 18 views
0

删除多个列我有两个表是这样的:MySQL的两个表

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。所以,当我想从类别中删除食品条目时,我想要删除所有的子类别和文档。

我该怎么做?

回答

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; 
+0

所以当我试图删除语法应该如何? – Valour 2009-11-18 13:57:05

+0

INSERT INTO'docs'.'categories'( 'id', 'name', 'parent' ) VALUES( NULL, '样品', '0' ) #1452 - 不能添加或更新子行:外键约束失败('docs/categories',CONSTRAINT'categories_ibfk_1' FOREIGN KEY('parent')REFERENCES'categories'('id')ON DELETE CASCADE) 我收到此错误当试图从phpMyAdmin插入一行 – Valour 2009-11-18 14:06:49

+0

在这种情况下,您引用的是不存在的0的categories.id。这导致您的外键约束失败。对于父类别(根级别),您可能需要将此值设置为NULL。 – 2009-11-18 14:08:57

0

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

0

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

下面是一个简单的Oracle例如:

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

你有两个选择 - 在任何情况下,我建议你为你的人际关系建立外键约束。

选择1是使用ON DELETE CASCADE。不过,我认为这不是一个好的做法,因为意外删除会带来相当令人惊讶的后果。

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

触发器像其他的想法只是一个2