2012-02-26 13 views
0

TestChildテーブルのnum列の合計値をキャッシュし、いくつかの行を挿入するTestParentテーブルを作成します。SQLトリガーでエラーが発生する

CREATE TABLE TestParent (
id INT NOT NULL PRIMARY KEY, 
total INT NOT NULL DEFAULT 0); 

CREATE TABLE TestChild (
parent_id INT NOT NULL, 
num INT NOT NULL); 

INSERT INTO TestParent (id) VALUES (123); 
INSERT INTO TestChild (parent_id, num) VALUES (123, 1); 

CREATE PROCEDURE Sync (IN parent INT) 
    UPDATE TestParent SET total = (
     SELECT SUM(num) FROM TestChild WHERE parent_id=parent) 
    WHERE id=parent; 

CALL Sync (123); 

これまでのところ、とても良いです。今、Syncを自動的に呼びたいと思っています...

CREATE TRIGGER TestInsert 
AFTER INSERT ON TestChild 
FOR EACH ROW CALL Sync (parent_id); 

これも機能します。さて、

INSERT INTO TestChild (parent_id, num) VALUES (123, 1); 

は、挿入が起こった

#1054 - Unknown column 'parent_id' in 'field list' 

を与えるが、ストアドプロシージャが呼び出されていません。どうしたの?

答えて

2

あなたは、それだけだ

CREATE TRIGGER TestInsert 
AFTER INSERT ON TestChild 
FOR EACH ROW CALL Sync (NEW.parent_id); 
+0

を挿入してしまった値に感謝を参照するためにNEW.parent_idを使用する必要があります。トリガーが作成されたときにIDがこの種のエラーを捕まえられない、または捕まえない理由は何ですか? – spraff

+0

これは、このような欠点が多いフリーウェアのデータベースエンジンです。 – Kamil

+0

1. MySQLはフリーウェアではなく、GPLのライセンスを受けています。 2.構文エラーではないためです。作成時に、MySQLはトリガが実行されるコンテキストを知る方法がありません。あなたのような定義されたトリガーが理にかなっている場合、ポジショニングがあります(私はその時は思い付くことはできませんが)。 – Mchl

関連する問題