Удалить глубоко вложенное поддерево с помощью 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 уровней.
...