Triggers MySQL触发器,在插入另一个表后在表中插入一条记录
有两个MySQL表,第一个存储根据邻接列表模型构建的树,第二个是存储每个节点路径的帮助表 问题是如何设置触发器,以便在邻接表中插入后,将存储路径记录的记录插入到helper表中 想法与这里相同: 但有以下区别: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”列为:
- 如果节点的直接 父级是根(id=0)
- 不将记录的id存储在路径的末尾
- 路径中没有前后斜杠
- ““定界器”而不是“/”
- 邻接表:“prefix_productcategories”列
,id
,parent
name
- 助手表“prefix\u prodcat\u path”列为:
,id
path
,id
为SMALLINT(3)无符号parent
是文本路径
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 ;