2011-01-07 3 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, вы правы. Это действительно работает. :-)

То, что я делал неправильно, помещало «0» для первого родителя через мое приложение PHP. Конечно, если я поставлю «0» (нет родителя с идентификатором «0»), тогда я нарушаю правила внешнего ключа. Итак, все, что мне нужно было сделать, - немного изменить инструкцию INSERT. Большое спасибо за то, что привлек это к моему вниманию. Спасибо всем!

Смежные вопросы