2012-02-19 17 views
0

MySQLデータベースに以下のトリガを作成しました。これは星評価システムのためのものです。レーティングテーブルに行が追加されるたびに、これがratings_totalsテーブルに追加されます。MySQLのトリガーがテーブルを更新しない

DELIMITER$$ 

create trigger update_vote_after_insert_trig before insert 
on ratings 
for each row begin 
if bookID = new.bookID then 
update ratings_totals set 
total_votes = total_votes + 1, 
total_rating = total_rating + new.rating, 
overall_rating = total_rating/total_votes; 
where 
bookID = new.bookID; 
ELSE 
insert into ratings_totals set bookID = new.bookID, total_votes = total_votes, total_rating = total_rating, overall_rating = overall_rating; 
END IF; 

END$$ 
DELIMITER ; 

私の問題は、ratings_totalsテーブルが正しく更新されていないことです。これには、bookID、total_votes、total_rating、およびoverall_ratingという4つの行が含まれています。 bookIDテーブルのみが更新されます。残りは0のままです。

私の目標は、最初に行を挿入し、その後に更新することです。私はこの権利をしていますか?

+0

なぜあなたは挿入してから更新しますか?なぜあなたはすぐに挿入しないのですか? –

+0

最初の挿入後、同じ行(つまり、評価されている項目ごとに1行)を更新したいだけです。私は同じアイテムのたびに新しい行を挿入したくありません。それは意味をなさないでしょう。 –

+0

私は今すぐ挿入ラインを取り出しましたが、それは違いはありません。トリガはまだ機能しません。 –

答えて

0

最初に挿入して初めての後に更新する場合は、 "IF"文を使用することができます。 場合(これが初めてです) ///あなたのコード他 //この行を挿入した場合、これがされる前に

は見つけるための「選択」を使用することができますあなたのコードあなたの

「IF」
+0

申し訳ありませんが、私はコードにいくつかの変更を加えましたが、今はMySQLエラーが発生しています:#1064 - あなたはSQL構文に誤りがあります。 'DELIMITER $$ を作成する前にcreate trigger trigger_vote_after_insert_trig before on rati' 1行目 –

0

「新」は「古い」であってはなりませんか? Like:

DELIMITER $$ 

create trigger update_vote_after_insert after insert 
on ratings 
for each row begin 
    update ratings_totals set 
    total_votes = total_votes + 1, 
    total_rating = total_rating + old.rating, 
    overall_rating = total_rating/total_votes 
    where 
    bookID = old.bookID; 

end$$ 
DELIMITER ; 
+0

いいえ、新しく挿入されたレーティングを合計に追加するためです評価。 –

+0

問題は新しい/古いものでなければなりません。私はtotal_ratingとoverallのみが更新されていると思います。このページを見てくださいhttp://dev.mysql.com/doc/refman/5.0 /en/create-trigger.htmlとその最初のユーザーコメント。たぶん役立つでしょう – jribeiro

+0

いいえ、bookIDのみが更新されます。他に何もありません。しかし、ありがとう、私は見てみましょう。 –

関連する問題