Имеет две таблицы MySQL, сначала хранящую дерево, построенное по модели списка смежности, а вторая - вспомогательную таблицу, хранящую путь к каждому узлу.MySQL триггер, чтобы вставить запись в таблицу после INSERT в другой таблице
Вопрос заключается в том, как установить триггер, чтобы после вставки в таблице смежности запись в запись пути была вставлена в вспомогательную таблицу.
Идея такая же, как и здесь: https://kod34fr33.wordpress.com/2008/05/06/adjacency-list-tree-on-mysql/ , но со следующими отличиями:
- запись не должна храниться в хелперов таблице, если прямой родительского узла является корень (который имеет ID = 0)
- не сохраняет идентификатор записи в конце пути
- не ведущий ни замыкающая косые на пути
- «» delimitor вместо "/"
Таблица структур:
- смежности стол: "prefix_productcategories" колонн
id
,parent
,name
. - Помощник стол "prefix_prodcat_path" столбцы являются:
id
,path
id
,parent
являются SMALLINT (3) UNSIGNEDpath
текстов.
После нескольких исправлений к моему первоначальному коду я могу исправить ошибки синтаксиса. Итак, вот один из возможных решение для MariaDB (и, вероятно, для MySQL тоже), надеясь, что это может помочь другим:
DELIMITER //
CREATE TRIGGER `insertProdCatPathRecord` AFTER INSERT ON `prefix_productcategories`
FOR EACH ROW BEGIN
DECLARE `path_of_parent` TEXT DEFAULT '';
IF (NEW.`parent` > 0) THEN
SELECT `path` INTO `path_of_parent` FROM `prefix_prodcat_path` WHERE `prefix_prodcat_path`.`id`= NEW.`parent`;
IF (SELECT FOUND_ROWS()) THEN
INSERT INTO `prefix_prodcat_path` VALUES (NEW.`id`,CONCAT(NEW.`parent`,'.',NEW.`id`));
ELSE
INSERT INTO `prefix_prodcat_path` VALUES(NEW.`id`,NEW.`parent`);
END IF;
END IF;
END; //
DELIMITER ;
При создании процедуры/функции/триггер, вы должны использовать временный разделитель после этой процедуры: 'END// ' –
Да, конечно. Извините за опечатки. Любая идея, что не так с синтаксисом? Если я удаляю строку «DECLARE ...» и «INTO ...», синтаксическая ошибка остается на строке «SELECT ...». – OuzoPower
Вещи, которые я узнал при очистке моего кода: 1) точки с запятой необходимы после ключевых слов END IF и END. 2) по какой-либо причине попытка использования CAST() числовых значений в TEXT в функцию CONCAT() не работала. Вероятно, CONCAT() делает литье под заказ. – OuzoPower