2017-01-15 11 views
0

Имеет две таблицы 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) UNSIGNED
  • path текстов.

После нескольких исправлений к моему первоначальному коду я могу исправить ошибки синтаксиса. Итак, вот один из возможных решение для 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 ; 
+0

При создании процедуры/функции/триггер, вы должны использовать временный разделитель после этой процедуры: 'END// ' –

+0

Да, конечно. Извините за опечатки. Любая идея, что не так с синтаксисом? Если я удаляю строку «DECLARE ...» и «INTO ...», синтаксическая ошибка остается на строке «SELECT ...». – OuzoPower

+0

Вещи, которые я узнал при очистке моего кода: 1) точки с запятой необходимы после ключевых слов END IF и END. 2) по какой-либо причине попытка использования CAST() числовых значений в TEXT в функцию CONCAT() не работала. Вероятно, CONCAT() делает литье под заказ. – OuzoPower

ответ

0

Ну, вот что я нашел до сих пор. У вас нет ключевых слов THEN, связанных с IF, а также у вас есть END вместо END IF. Синтаксис DECLARE неверен, вы не можете установить значения по умолчанию. Кроме того, не знаю, что такое @@ ROWCOUNT. (Edit: нашел, что это связано с MS SQL Server, но не используется в MySQL.)

DELIMITER // 
CREATE TRIGGER insertProdCatPathRecord AFTER INSERT ON prefix_productcategories 
FOR EACH ROW 
BEGIN 
IF (NEW.parent > 0) THEN 
    DECLARE path_of_parent TEXT; 
    SET path_of_parent=''; 
    SELECT path INTO path_of_parent FROM prefix_prodcat_path WHERE prefix_prodcat_path.id= NEW.parent; 
    IF (@@ROWCOUNT) 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 ; 
+0

Благодарим вас за то, что упомянули те синтаксические ошибки, которые я исправил. Я удалил временную переменную path_of_parent, поскольку CONCAT выполняется в первом заявлении INSERT. Я удалил несколько бутербродов BEGIN ... END. Я отправил свою вторую попытку в исходное сообщение. К сожалению, по-прежнему существует синтаксическая ошибка рядом с первым INSERT. – OuzoPower

+0

Решение найдено. См. Оригинальное сообщение. – OuzoPower