2017-01-15 19 views
0

2つのMySQLテーブルがあり、最初に隣接リストモデルに従って構築されたツリーが格納されます。MySQLトリガーは、別のテーブルにINSERTした後にテーブルにレコードを挿入します。

質問はどのようにトリガーを設定するのですか。これは、隣接テーブルの挿入後に、パスレコードを格納しているレコードがヘルパーテーブルに挿入されるようにするためです。

アイデアはここと同じです:https://kod34fr33.wordpress.com/2008/05/06/adjacency-list-tree-on-mysql/ が、次のような違いがあります

  • ノードの直接の 親にid = 0を持つルート(ある場合にレコードがヘルパーテーブルに格納されてはなりません)
  • パス
  • には主要も末尾スラッシュパス
  • の終わりにレコードのIDを格納しません「」

    • 隣接テーブル: "prefix_productcategories" 列 idparentname delimitor代わりに "/"

    表構造の。

  • ヘルパーテーブル "prefix_prodcat_path" 列は次のとおりidpath
  • idparent(3)UNSIGNED
  • pathは、テキストがSMALLINTです。

最初のコードにいくつかの修正を加えた後、構文エラーを修正できました。 だから、ここMariaDBのための1つの可能な解決策、それは他の人を助けることができる期待して、(おそらく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

はい、もちろんです。タイプミスを申し訳ありません。構文に何が間違っているのでしょうか? "DECLARE ..."行と "INTO ..."を削除すると、構文エラーは "SELECT ..."行にとどまります。 – OuzoPower

+0

私のコードを掃除するときに学んだこと:1)END IFとENDキーワードの後に​​セミコロンが必要です。 2)何らかの理由でCAST()の数値をTEXTにCONCAT()関数に入力しようとしていませんでした。おそらくCONCAT()は必要なキャスティングを行います。 – OuzoPower

答えて

0

さて、ここで私がこれまでに見つかったものです。 IFに関連するキーワードTHENと、END IFの代わりにENDがあるとします。 DECLAREの構文が間違っています。デフォルト値を設定することはできません。また、@@ ROWCOUNTを知りません。

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サンドイッチも取り除いた。私は元の投稿に2回目の試みを掲載しました。残念ながら、最初のINSERTの近くに構文エラーがあります。 – OuzoPower

+0

解決策が見つかりました。元の投稿を参照してください。 – OuzoPower

関連する問題