有兩個MySQL表,第一個存儲根據鄰接表模型構建的一棵樹,第二個是輔助表中存儲路徑的每個節點插入一條記錄在表格中插入之後。MySQL的觸發另一個表
的問題是/是如何設置的觸發器,使得在鄰接表的插入之後,存儲所述路徑記錄的記錄被插入到輔助表。
的想法是同樣在這裏:https://kod34fr33.wordpress.com/2008/05/06/adjacency-list-tree-on-mysql/ 但有以下區別:
- 沒有記錄應保存在助手錶,如果該節點的直接 父母是根(其中有ID = 0 )
- 在路徑
- 沒有前導也不後斜槓在路徑
- 的結束不存儲的記錄的ID「」代替 「/」
表結構delimitor:
- 鄰接表: 「prefix_productcategories」 列
id
,parent
,name
。 - 助手錶 「prefix_prodcat_path」 列是:
id
,path
id
,parent
是SMALLINT(3)UNSIGNEDpath
是TEXT。
對我的初始代碼進行了幾處更正之後,我可以更正語法錯誤。 所以,這裏是爲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//' –
當然可以。對不起,錯別字。任何想法有什麼問題的語法? 如果我刪除「聲明...」線和「INTO ...」,語法錯誤停留在「SELECT ...」行。 – OuzoPower
清理我的代碼時我學到了以下內容:1)END IF和END關鍵字之後需要使用分號。 2)出於某種原因,試圖將CAST()數值輸入到CONCAT()函數中不起作用。 CONCAT()可能會做必要的鑄造。 – OuzoPower