PHP, MySQL, категории и подкатегории - удаление
-
08-10-2019 - |
Вопрос
У меня есть таблица 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?
Решение
Работает на меня.
#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)
Другие советы
Вы определили внешний ключ наоборот наоборот.
Вы должны определить это как:
ALTER TABLE categories ADD CONSTRAINT FOREIGN KEY (id)
REFERENCES Parent(Parent) ON DELETE CASCADE
Вам нужно что-то в этом роде:
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» для первого родителя через мое приложение PHP. Конечно, если я положу «0» (нет родителей с идентификатором «0»), то я нарушаю правила внешнего ключа. Итак, все, что мне нужно было сделать, это редактировать свою заявку вставки немного. Большое спасибо, чтобы привлечь это к моему вниманию. Спасибо всем!