Удалить глубоко вложенное поддерево с помощью ON DELETE CASCADE - PullRequest
0 голосов
/ 16 сентября 2018

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

Получена ошибка 193 'mydb. tree, CONSTRAINT tree_ibfk_1 FOREIGN KEY (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 Ответ

0 голосов
/ 17 сентября 2018

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

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

...

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

...

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

...

...