MySQL触发器在INSERT之后在另一个表中插入记录

时间:2017-01-15 17:21:39

标签: triggers path tree insert mariadb

有两个MySQL表,第一个存储根据邻接列表模型构建的树,第二个是存储每个节点路径的辅助表。

问题是/是如何设置触发器,以便在邻接表中插入后,将存储路径记录的记录插入到辅助表中。

这个想法与此处相同:https://kod34fr33.wordpress.com/2008/05/06/adjacency-list-tree-on-mysql/ 但有以下不同之处:

  • 如果节点是直接的,则不应在辅助表中存储记录 parent是根(具有id = 0)
  • 不在路径末尾存储记录的ID
  • 路径中没有前导或斜杠
  • “”。分隔符而不是“/”

表格结构:

  • 邻接表:“prefix_productcategories”列 $subtitles = Subtitles::load('subtitles.srt'); // load file $subtitles->time(2); // add 2 seconds $subtitles->save('new-subtitles-file.srt'); idparent
  • 帮助程序表“prefix_prodcat_path”列为:nameid
  • pathid是SMALLINT(3)UNSIGNED
  • parent是TEXT。

在对我的初始代码进行多次更正后,我可以纠正语法错误。 所以,这里有一个可能的解决方案用于MariaDB(也可能用于MySQL),希望它可以帮助其他人:

path

1 个答案:

答案 0 :(得分:0)

嗯,这是我到目前为止所发现的。您没有与THEN相关的关键字IF,也没有END而不是END IFDECLARE的语法错误,您无法设置默认值。另外,不知道@@ ROWCOUNT是什么。 (编辑:发现它,它与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 ;