2つのMySQLテーブルがあり、最初に隣接リストモデルに従って構築されたツリーが格納されます。MySQLトリガーは、別のテーブルにINSERTした後にテーブルにレコードを挿入します。
質問はどのようにトリガーを設定するのですか。これは、隣接テーブルの挿入後に、パスレコードを格納しているレコードがヘルパーテーブルに挿入されるようにするためです。
アイデアはここと同じです:https://kod34fr33.wordpress.com/2008/05/06/adjacency-list-tree-on-mysql/ が、次のような違いがあります
- ノードの直接の 親にid = 0を持つルート(ある場合にレコードがヘルパーテーブルに格納されてはなりません)
- パス
- には主要も末尾スラッシュパス
- の終わりにレコードのIDを格納しません「」
- 隣接テーブル: "prefix_productcategories" 列
id
、parent
、name
delimitor代わりに "/"
表構造の。
- 隣接テーブル: "prefix_productcategories" 列
- ヘルパーテーブル "prefix_prodcat_path" 列は次のとおり
id
、path
id
、parent
(3)UNSIGNEDpath
は、テキストが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 ;
プロシージャ/ファンクション/トリガを作成するときは、このプロシージャの後に一時デリミタを使用する必要があります。 'END// ' –
はい、もちろんです。タイプミスを申し訳ありません。構文に何が間違っているのでしょうか? "DECLARE ..."行と "INTO ..."を削除すると、構文エラーは "SELECT ..."行にとどまります。 – OuzoPower
私のコードを掃除するときに学んだこと:1)END IFとENDキーワードの後にセミコロンが必要です。 2)何らかの理由でCAST()の数値をTEXTにCONCAT()関数に入力しようとしていませんでした。おそらくCONCAT()は必要なキャスティングを行います。 – OuzoPower