Triggers MySQL触发器,在插入另一个表后在表中插入一条记录

Triggers MySQL触发器,在插入另一个表后在表中插入一条记录,triggers,path,tree,insert,mariadb,Triggers,Path,Tree,Insert,Mariadb,有两个MySQL表,第一个存储根据邻接列表模型构建的树,第二个是存储每个节点路径的帮助表 问题是如何设置触发器,以便在邻接表中插入后,将存储路径记录的记录插入到helper表中 想法与这里相同: 但有以下区别: 如果节点的直接 父级是根(id=0) 不将记录的id存储在路径的末尾 路径中没有前后斜杠 ““定界器”而不是“/” 表结构: 邻接表:“prefix_productcategories”列 id,parent,name 助手表“prefix\u prodcat\u path”列为:

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

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

想法与这里相同: 但有以下区别:

  • 如果节点的直接 父级是根(id=0)
  • 不将记录的id存储在路径的末尾
  • 路径中没有前后斜杠
  • ““定界器”而不是“/”
表结构:

  • 邻接表:“prefix_productcategories”列
    id
    parent
    name
  • 助手表“prefix\u prodcat\u path”列为:
    id
    path
  • id
    parent
    为SMALLINT(3)无符号
  • 路径
    是文本
在对初始代码进行了几次更正之后,我可以更正语法错误。 因此,这里有一个可能的解决方案适用于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 ;

好吧,这是我到目前为止发现的。您没有与
IF
相关的
关键字,也没有
END
而不是
END IF
DECLARE
的语法错误,无法设置默认值。还有,不知道什么是@@ROWCOUNT。(编辑:找到了,它与MS SQL Server相关,但不用于MySQL。)


创建过程/函数/触发器时,应在此过程之后使用临时分隔符:
END/
Yes,当然。对不起,我打错了。你知道语法有什么问题吗?如果我删除“DECLARE…”行和“INTO…”,语法错误将保留在“SELECT…”行。我在清理代码时学到的一些东西:1)在END If和END关键字之后必须使用分号。2) 出于某种原因,尝试将()数值强制转换为文本到CONCAT()函数中是无效的。可能是CONCAT()进行了必要的强制转换。感谢您提到我纠正的那些语法错误。在第一个INSERT语句中执行CONCAT时,我删除了“path\u of_parent”临时变量。我删除了几个开始。。。还有三明治。我在最初的帖子中发布了我的第二次尝试。不幸的是,在第一个INSERT.Solution附近仍然存在语法错误。见原文。
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 ;