PHP, MySQL, категории и подкатегории - удаление - PullRequest
1 голос
/ 07 января 2011

У меня есть таблица 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?

Ответы [ 4 ]

2 голосов
/ 07 января 2011

Вы определили внешний ключ наоборот.
Вы должны определить это как:

ALTER TABLE categories ADD CONSTRAINT FOREIGN KEY (id)
REFERENCES Parent(Parent) ON DELETE CASCADE 
1 голос
/ 08 января 2011

У меня работает.

#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)
0 голосов
/ 08 января 2011

Роннис, Фу, ты прав.Это действительно работает.:-)

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

0 голосов
/ 08 января 2011

вам нужно что-то вроде этого:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...