2012-04-25 3 views
4
CREATE TABLE `categories` (
    `idcategories` INT NOT NULL AUTO_INCREMENT , 
    `idparent` INT NULL , 
    `description` VARCHAR(45) NULL , 
    PRIMARY KEY (`idcategories`)); 

ALTER TABLE `categories` 
    ADD CONSTRAINT `FK_idparent` 
    FOREIGN KEY (`idparent`) 
    REFERENCES `ilmercatinodelpulcino`.`categories` (`idcategories`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE 
, ADD INDEX `FK_idparent` (`idparent` ASC) ; 

INSERT INTO `categories` (`idcategories`, `description`) 
    VALUES (1, 'cat1'); 
INSERT INTO `categories` (`idcategories`, `idparent`, `description`) 
    VALUES (2, 1, 'cat1_child'); 

Таким образом, эта таблица представляет собой категорию с идентификатором и самонаводящимся родительским идентификатором. Я вставил категорию cat1 и подкатегорию cat1_child с родительским идентификатором cat1.ОШИБКА 1451: Не удается удалить или обновить родительскую строку: ограничение внешнего ключа завершено.

Теперь, я хочу, чтобы иметь возможность изменять idcategory cat1 с 1 по 10, и поскольку я устанавливаю внешний ключ при обновлении CASCADE, я ожидаю, что idparent cat1_child будет установлен на 10. Но когда я делаю:

UPDATE `categories` SET `idcategories`=10 WHERE `idcategories`='1'; 

Я получаю сообщение об ошибке:

ERROR 1451: Cannot delete or update a parent row: a foreign key constraint fails (categories , CONSTRAINT FK_idparent FOREIGN KEY (idparent) REFERENCES categories (idcategories) ON DELETE CASCADE ON UPDATE CASCADE) SQL Statement: UPDATE categories SET idcategories =10 WHERE idcategories ='1'

поле Удалять вместо работать, как и ожидалось, и удаление cat1, cat1_child будут удалены, а также.

Где ошибка? Чем вы.

+0

возможно дубликат [MySQL: ON UPDATE CASCADE для простой таблицы «ID | родитель «текст», невозможно?] (http://stackoverflow.com/questions/5446517/mysql-on-update-cascade-for-a-simple-table-idparenttext-not-possible) – mellamokb

ответ

7

Я считаю, что ответ находится в documentation (прокрутите вниз до нижней части):

Deviation from SQL standards: If ON UPDATE CASCADE or ON UPDATE SET NULL recurses to update the same table it has previously updated during the cascade, it acts like RESTRICT . This means that you cannot use self-referential ON UPDATE CASCADE or ON UPDATE SET NULL operations. This is to prevent infinite loops resulting from cascaded updates. A self-referential ON DELETE SET NULL , on the other hand, is possible, as is a self-referential ON DELETE CASCADE . Cascading operations may not be nested more than 15 levels deep.

Демо: http://www.sqlfiddle.com/#!2/e29db/1

+0

Спасибо. Есть ли какой-нибудь warkaround, чтобы делать то, что я хочу? –