Удалить глубоко вложенное поддерево с помощью ON DELETE CASCADE

Я искал методы удаления поддеревьев деревьев, хранящихся в модели списка смежности. Я установил этот код, который удаляет полное дерево, используя ON DELETE CASCADE. Когда я устанавливаю max_ в значение> 14, MariaDB (Windows) выдает эту ошибку:

Получил ошибку 193 'mydb,tree, ОГРАНИЧЕНИЕ tree_ibfk_1 ИНОСТРАННЫЙ КЛЮЧ (parentid) РЕКОМЕНДАЦИИ tree (nodeid) НА УДАЛЕННОМ КАСКАДЕ от InnoDB

Это мой код или ограничение базы данных?

DROP TABLE IF EXISTS tree;
DROP PROCEDURE IF EXISTS prepTree;

CREATE TABLE tree (
    name varchar(255) NOT NULL,
    nodeid INT NOT NULL AUTO_INCREMENT,
    parentid INT NULL,
    PRIMARY KEY(nodeid),
    FOREIGN KEY(parentid) REFERENCES tree(nodeid) ON DELETE CASCADE
) ENGINE=InnoDB;

DELIMITER // ;
CREATE PROCEDURE prepTree()
    BEGIN
        DECLARE i INT;
        DECLARE max_ INT;

        SET max_ = 15; -- >14 won't work

        INSERT INTO tree(name, parentid) VALUES("root", NULL);

        SET i = 1;  
        WHILE i <= max_ DO
            INSERT INTO tree(name, parentid) VALUES("child", i);        
            SET i = i + 1;
        END WHILE;

    END //
DELIMITER ; //

CALL prepTree; 

DELETE FROM tree WHERE name = "root";
SELECT * FROM tree; --table will be empty on success

1 ответ

Я понимаю, что это в равной степени относится и к MariaDB.

15.8.1.6 Ограничения InnoDB и FOREIGN KEY

...

Ссылочные Действия

...

  • ... Каскадные операции не могут быть вложены более чем на 15 уровней.

...

Другие вопросы по тегам