2011-01-07 53 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语句。非常感谢您提醒我注意这一点。谢谢大家!