2012-02-07 51 views
0

我可以拥有它们吗?MYsql中的child-parent约束?

我有强迫,如果从不同的表中的相关行被删除的行删除约束:

node INT UNSIGNED NOT NULL, 
id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
name VARCHAR(20) NOT NULL,  
title VARCHAR(200) NOT NULL, 
description MEDIUMTEXT, 
category VARCHAR(20) NOT NULL, 
parent INT UNSIGNED DEFAULT 0,    # here is the parent term id 
              # if it's 0 the term has no parent 

PRIMARY KEY(id), 
UNIQUE KEY(name, node, category), 
KEY parent(parent), 
KEY category(category), 

CONSTRAINT terms FOREIGN KEY(node) 
    REFERENCES nodes(id) ON DELETE CASCADE ON UPDATE RESTRICT 

我想迫使如果“家长”一词行的自动删除另一个约束被删除? (如果有一个长期父集)

例子:

node | id | name | title | description | category | parent 
___________________________________________________________________ 
534 | 1 | A  | Foooooo | Bla bla...  | A  | 0 
54 | 2 | B  | Foooooo | Bla bla...  | A  | 1 
45 | 3 | C  | Foooooo | Bla bla...  | A  | 2 
545 | 4 | D  | Foooooo | Bla bla...  | A  | 2 
534 | 5 | E  | Foooooo | Bla bla...  | A  | 1 

这样的术语是这样的:

A 
    - B 
    --- C 
    --- D 
    - E 

所以,如果我删除B,我想C和d被删除,以及, 如果我删除A,则B,C,d,E应删除...

回答

3

没有所谓的“条件”约束没有这样的事:无论你的父母领域八方通引用另一行(即不允许0),或者完全没有限制。

这是一个非常正常的用例,通常你可以在父项上使用ON DELETE TRIGGER来解决它,这也会删除子项,并由父项选择它们。

在您的例子,你可能会考虑像

CREATE TRIGGER cascade_delete_children 
    BEFORE DELETE ON node 
    FOR EACH ROW 
     DELETE FROM node WHERE parent=OLD.id; 
2

可以使用NULL代替0与级联定义FOREIGN KEY删除:

parent INT UNSIGNED NULL DEFAULT NULL, --- here is the parent term id 
              --- if it's NULL the term has no parent 
... 

CONSTRAINT parent_fk FOREIGN KEY(parent) 
    REFERENCES thisTable(id) 
     ON DELETE CASCADE 
     ON UPDATE RESTRICT