Рассмотрим следующую схему:
Таблица 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 шага:
- Добавить себя -relation;
- Добавить отношение между новым элементом и данным родителем
- Добавить отношение между новым элементом и всеми потомками (на основе родительского элемента).
В настоящее время я делаю возникла проблема с шагом 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 с теми же значениями, что и из результатов триггера с ненулевым значением.
Что бы я ни пытался (по-разному настраивая v_seq), оно закончилось тем же результатом NULL. Любые советы, как сделать шаг этого триггера работающим?