2011-01-07 52 views
1

我有一個MySQL表是這樣的:PHP,MySQL的,類別和子類別 - 刪除

CREATE TABLE categories 
(
     ID INT NOT NULL, 
     Name VARCHAR(100) NULL, 
     Parent INT NULL, 
     PRIMARY KEY (ID) 
)Engine=InnoDB 

我想要做的是確保所有兒童的缺失,每當父母被刪除。起初,我想通過在表中添加一個外鍵來實現:

ALTER TABLE categories ADD CONSTRAINT FOREIGN KEY Parent(Parent) 
REFERENCES categories(ID) ON DELETE CASCADE 

這是行不通的。我也嘗試過內部關係,但沒有成功。

父母和他們的孩子與一個遞歸的PHP函數鏈接。 MySQL中有沒有實現這個目標的方法,或者它應該使用PHP來完成?

回答

1

爲我工作。

#Server version: 5.1.42-community MySQL Community Server (GPL) 
create table lists(
    id int not null 
    ,parent int 
    ,primary key(id) 
    ,foreign key(parent) references lists(id) on delete cascade 
) Engine=InnoDb; 

insert into lists(id, parent) values(1, null); 
insert into lists(id, parent) values(2, 1); 
insert into lists(id, parent) values(3, 2); 
insert into lists(id, parent) values(4, 3); 

mysql> select * from lists; 
+----+--------+ 
| id | parent | 
+----+--------+ 
| 1 | NULL | 
| 2 |  1 | 
| 3 |  2 | 
| 4 |  3 | 
+----+--------+ 
4 rows in set (0.00 sec) 

mysql> 
mysql> delete from lists where id = 1; 
Query OK, 1 row affected (0.02 sec) 

mysql> 
mysql> select * from lists; 
Empty set (0.00 sec) 
2

你已經用其他方式定義了外鍵。
你應該把它定義爲:

ALTER TABLE categories ADD CONSTRAINT FOREIGN KEY (id) 
REFERENCES Parent(Parent) ON DELETE CASCADE 
0

你需要的東西是這樣的:

drop table if exists categories; 
create table categories 
(
cat_id int unsigned not null auto_increment primary key, 
name varchar(255) not null, 
parent_id int unsigned null, 
foreign key (parent_id) references categories(cat_id) on delete cascade 
) 
engine = innodb; 
0

Ronnis,Foo,你說得對。真的行。 :-)

我做錯了的事情是通過我的PHP應用程序爲第一個父母加「0」。當然,如果我把「0」(沒有父母的ID爲「0」),那麼我違反了外鍵規則。所以,我所要做的就是稍微編輯一下INSERT語句。非常感謝您提醒我注意這一點。謝謝大家!