Mysql Внешний ключ

udodirc
Дата: 09.01.2013 13:58:05
Здраствуйте, есть вопрос.
Вот есть допустим таблица `category`
В этой таблице три поля id, parent_id, name.

Вопрос: могули я создать внешний ключ parent_id таблицы `category` на поле id той же таблицы`category`.

--
-- Table structure for table `category`
--

CREATE TABLE IF NOT EXISTS `category` (
`id` int(8) NOT NULL AUTO_INCREMENT,
`parent_id` int(8) DEFAULT NULL,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`id`),
KEY `parent_id` (`parent_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

--
-- Dumping data for table `category`
--

INSERT INTO `category` (`id`, `parent_id`, `name`) VALUES
(1, NULL, 'Цветы'),
(2, 1, 'Розы');

--
-- Constraints for dumped tables
--

--
-- Constraints for table `category`
--
ALTER TABLE `category`
ADD CONSTRAINT `category` FOREIGN KEY (`parent_id`) REFERENCES `category` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;


Создал таблицу, если меняю id родительской записи пишет:

#1451 - Cannot delete or update a parent row: a foreign key constraint fails (`test2`.`category`, CONSTRAINT `category` FOREIGN KEY (`parent_id`) REFERENCES `category` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)
miksoft
Дата: 09.01.2013 14:06:27
udodirc
меняю id родительской записи
Поясните подробнее, что именно вы меняете.
Вы меняете значение поля id в родительской записи или значение поля parent_id в дочерней записи?
А лучше - покажите SQL-запрос, которым вы это делаете.
udodirc
Дата: 09.01.2013 14:10:57
miksoft,

Тут такая ситуация.
Я хочу сделать так, чтобы при удаление раздела допустим id 5, удалялись автоматом все его подразделы у кого стоят parent_id = 5.
Зачем? Есть еще таблица products, она связана с таблицей category по внешнему ключу.
Когда удаляется категоряи под id 5, то удаляются все значение в таблице продукты по внешнему ключу, плюс все подразделы где parent_id = 5.
То есть я хочу удалить одним действием все подчиненые записи.
miksoft
Дата: 09.01.2013 14:14:04
udodirc,

Вы таки запрос покажите.
udodirc
Дата: 09.01.2013 14:18:31
miksoft,

UPDATE `test2`.`category` SET `id` = '22' WHERE `category`.`id` =1

MySQL said: Documentation
#1451 - Cannot delete or update a parent row: a foreign key constraint fails (`test2`.`category`, CONSTRAINT `category` FOREIGN KEY (`parent_id`) REFERENCES `category` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)
miksoft
Дата: 09.01.2013 14:24:47
udodirc,

А почему вы хотите сделать удаление, а делаете UPDATE?

В приличных домах, кстати, за такой UPDATE могут и канделябром...
Если это не учебный проект, то забудьте вообще про изменение первичного ключа. Да и про такие каскадные удаления записей - желательно, тоже.
Users
Дата: 09.01.2013 14:26:06
udodirc
miksoft,

UPDATE `test2`.`category` SET `id` = '22' WHERE `category`.`id` =1

MySQL said: Documentation
#1451 - Cannot delete or update a parent row: a foreign key constraint fails (`test2`.`category`, CONSTRAINT `category` FOREIGN KEY (`parent_id`) REFERENCES `category` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)



Если я правильно ошибаюсь - то форейн кей стоит неверно. Кстати, об этом и написано - parent row. Другая таблица считается папой. А то, что вы хотите получить - то папой должна быть таблица, которую обновляете.
udodirc
Дата: 09.01.2013 14:27:32
Я проверял на Update, будет вообще работать или нет. В других таблицах работает и update и delete. Там ON DELETE CASCADE ON UPDATE CASCADE, то есть можно и то и другое.
udodirc
Дата: 09.01.2013 14:29:06
Users,

Как сделать правильно, можете дать пример или выложить код.
Users
Дата: 09.01.2013 14:45:10
udodirc,

Я невнимательно прочитал. делать ключ на саму себя и обновлять/удалять подобным образом - изврат.

Если хочется - надо сделать ключ между products и category с каскадным удалением.

Затем


select * from category с
join category с1 on c.id = c.parent_id
where id = 5.

Если записи отберутся правильно - должны - селект переделаете на delete.