我尝试使用http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/解释来实现相应插入和删除节点的过程。
例如,这是我创建的4个程序之一:
CREATE DEFINER=`root`@`localhost`
PROCEDURE `firstChildInsert`(IN `@ID` INT(10) UNSIGNED, IN `@L` BIGINT UNSIGNED)
MODIFIES SQL DATA
DETERMINISTIC
SQL SECURITY INVOKER
BEGIN
UPDATE `nodes` SET `r`=`r`+2 WHERE `r`>`@L` ORDER BY `l` DESC;
UPDATE `nodes` SET `l`=`l`+2 WHERE `l`>`@L` ORDER BY `l` DESC;
INSERT INTO `nodes`(`id`,`l`,`r`) VALUES(`@ID`,`@L`+1,`@L`+2);
END
想法是CALL firstChildInsert(#REF_OBJECT_ID,#PARENTNODE_LEFT_POSITION);
插入新节点... 其他三个是nextSiblingInsert(...),deleteNode(...)(和后代),shiftNode(... )(同时保留后代)。
然而,在更新插入点右侧所有节点的ORDER BY
(右)位置时,甚至会将l
列更改为r
(LEFT)。我收到了消息" 重复输入'#'关键词' "。
PRIMARY KEY
l
id
已完成l
列,因为我可能会使用相同的"类别"在几个节点中。
因此,很明显我可以将其用作关键ORDER BY
和UPDATE
列,但是:
PROCEDURE
条款不在PROCEDURE
的{{1}}声明中工作?DETERMINISTIC
成为{{1}}吗?