2013-04-01 5 views
4

У меня есть 1 таблица MySQL. Это выглядит следующим образом:PHP MySQL Удалить родительские и дочерние строки

+---------+-------------+--------+ 
| item_id | parent_id | Name | 
+---------+-------------+--------+ 
| 1  |  0  | Home | 
+---------+-------------+--------+ 
| 2  |  1  | Sub | 
+---------+-------------+--------+ 
| 3  |  2  | SubSub | 
+---------+-------------+--------+ 

Если я УДАЛИТЬ ITEM_ID 1, я хочу, чтобы удалить остальную часть суб также, но как я могу это сделать?

Я пробовал внешний ключ, но он работает, только если у вас есть 2 стола ??

Я надеюсь, что кто-то может помочь мне в MySQL, возможно, PHP?

ответ

5

Вы можете, определенно, использовать внешние ссылки внешних ключей с MySQL (вам не нужно несколько таблиц). Однако для любой поддержки внешнего ключа вам необходимо использовать InnoDB engine. И я предполагаю, что вы используете MyISAM engine.

С InnoDB вы можете создать таблицу, похожую на то, что у вас есть уже, в том числе автореферентного внешнего ключа, как это:

CREATE TABLE `yourTable` (
    `item_id` int(10) unsigned NOT NULL auto_increment, 
    `parent_id` int(10) unsigned default NULL, 
    `Name` varchar(50) NOT NULL, 
    PRIMARY KEY (`item_id`), 
    KEY `FK_parent_id` (`parent_id`), 
    CONSTRAINT `FK_parent_id` FOREIGN KEY (`parent_id`) REFERENCES `yourTable` (`item_id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

Затем, когда вы выдаете DELETE заявления, как:

DELETE FROM `yourTable` WHERE `item_id` = 1; 

... он удалит каждую строку «ребенка», которая имеет parent_id1. Если в какой-либо из этих «дочерних» строк есть собственные дети, они тоже будут удалены и т. Д. (Это то, что означает ON DELETE CASCADE).

+0

Вы можете сделать это с автообъединение на столе, а не создавать еще одну таблицу. – Shawn

+0

Когда я хочу вставить свои данные, я получаю эту ошибку: # 1452 - Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не работает – user2180410

+0

@ user2180410 При использовании ограничений внешнего ключа: если вы вставляете строку с непустым родителем 'значение, запись, которая имеет' item_id' с тем же значением, должна существовать заранее, если вы временно не отключите внешние ключи (о чем я бы советовал, так как это побеждает их цель). Внешние ключевые константы используются для обеспечения целостности данных. –

0

Легче на самом деле, чем мысль:

DELETE FROM table WHERE id = # OR parent_id = #; //where # is the same in both places. 

Пример:

DELETE FROM table WHERE id = 1 OR parent_id = 1; 
+0

Дело в том, что это не будет «каскадировать» дальше. Как видно из таблицы примеров OP, запись с 'item_id = 2' также имеет дочернюю строку (' item_id = 3'), которая не будет удалена вашим решением. Если OP в порядке с этим, этого будет достаточно, но OP должен знать, что ваше решение создаст сиротские записи. –

+0

Почему я получил голосу за хороший ответ с ограниченным объемом? Я думал, он имел в виду, если id равен 1, удалите детей с родителями 1. Я не понимал, что он хочет, чтобы все было позади. – Shawn

+0

Кроме того, объединение может решить эту проблему. Создание второй таблицы исключительно неэффективно и не является хорошим решением проблемы. – Shawn

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