考虑以下架构:
表 1:Schedule_items
id | id_schedule | id_element | id_type | id_parent | creation_time
表 2:Schedule_items_tree
id_rel | id_schedule | descendant | ancestor | depth | sequence
第二个表的目标是存储计划项目之间的关系。为了使它成为可能,每当我向表 1 添加新行时,都会触发插入后触发器并将新行添加到表 2。触发器有 3 个步骤:
- 添加自我关系;
- 添加新项目和给定父项之间的关系
- 添加新项目和所有后代之间的关系(基于项目的父项)。
目前,我确实对第 2 步有疑问,如下所示:
-- STEP 2: RELATION BETWEEN NEW ITEM AND GIVEN PARENT
SELECT max(`sequence`)+1 INTO @v_seq FROM `schedule_items_tree` WHERE `id_schedule` = new.`id_schedule` AND `descendant` = new.`id_parent`;
IF(v_seq IS NULL) THEN
INSERT INTO `test` (`text`) VALUES ("Trigger forced sequence number to 1");
SET v_seq = 1;
END IF;
-- proceed only if ancestor is not the same as descendant (self reference)
IF(new.`id_parent` IS NOT NULL AND new.`id_element` != new.`id_parent`) THEN
INSERT INTO `schedule_items_tree` (`id_schedule`,`descendant`,`ancestor`,`depth`,`sequence`) VALUES (new.`id_schedule`, new.`id_parent`, new.`id_element`, 1, v_seq);
END IF;
-- END OF STEP 2
查询SELECT max(sequence)+1
始终返回 NULL(每次执行触发器时,我的临时表都会获取新条目;仅为故障排除目的创建表)。这完全是奇怪的,因为执行相同的 SELECT 查询,其值与来自触发器结果的非 NULL 值相同。
到目前为止,无论我尝试什么(以不同方式设置 v_seq)都以相同的 NULL 结果结束。任何提示如何使该触发器的步骤起作用?