2017-01-15 85 views
0

有兩個MySQL表,第一個存儲根據鄰接表模型構建的一棵樹,第二個是輔助表中存儲路徑的每個節點插入一條記錄在表格中插入之後。MySQL的觸發另一個表

的問題是/是如何設置的觸發器,使得在鄰接表的插入之後,存儲所述路徑記錄的記錄被插入到輔助表。

的想法是同樣在這裏:https://kod34fr33.wordpress.com/2008/05/06/adjacency-list-tree-on-mysql/ 但有以下區別:

  • 沒有記錄應保存在助手錶,如果該節點的直接 父母是根(其中有ID = 0 )
  • 在路徑
  • 沒有前導也不後斜槓在路徑
  • 的結束不存儲的記錄的ID「」代替 「/」

表結構delimitor:

  • 鄰接表: 「prefix_productcategories」 列 idparentname
  • 助手錶 「prefix_prodcat_path」 列是:idpath
  • idparent是SMALLINT(3)UNSIGNED
  • path是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 ; 
+0

在創建過程/函數/觸發,你應該將這個程序後使用的臨時分隔符:'END//' –

+0

當然可以。對不起,錯別字。任何想法有什麼問題的語法? 如果我刪除「聲明...」線和「INTO ...」,語法錯誤停留在「SELECT ...」行。 – OuzoPower

+0

清理我的代碼時我學到了以下內容:1)END IF和END關鍵字之後需要使用分號。 2)出於某種原因,試圖將CAST()數值輸入到CONCAT()函數中不起作用。 CONCAT()可能會做必要的鑄造。 – OuzoPower

回答

0

好了,這裏是我到目前爲止發現的。因爲你有END代替END IF你不必與IF關鍵字THEN,也是如此。 DECLARE的語法錯誤,您無法設置默認值。另外,不知道@@ 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 ; 
+0

感謝您提及我糾正的那些語法錯誤。當CONCAT在第一個INSERT語句中完成時,我刪除了'path_of_parent'臨時變量。我也刪除了幾個BEGIN ... END三明治。我在原帖中發佈了第二次嘗試。不幸的是,在第一個INSERT附近仍然有一個語法錯誤。 – OuzoPower

+0

找到解決方案。查看原文。 – OuzoPower