2016-04-05 17 views
0

私は自分のデータベースのトリガーを作っています。この場合、私は本屋を経営しています、私は著者表を持っていて、私は本の表を持っています。著者テーブルには、著者のID、名前、生年月日、死亡日が含まれています。私の本の表には、book_id、著者のID、小売価格、出版日、書籍の評価が含まれています。私は著者の死亡時に6歳未満の評価を持つ本の価格を2倍にするトリガーを作成しようとしています。評価が6の場合は価格を50%上げるだけです。基本的に、authorsテーブルのdeath dateカラムが変更された場合、booksテーブルの小売価格カラムも変更する必要があります。これは私のコードです:しかしなぜ「選択」の近くに「誤った構文」が表示されるのですか? Expecting Set 'エラー?

CREATE TRIGGER author_death 
on authors 
AFTER UPDATE AS 
BEGIN 
    IF UPDATE(death) 
    Begin 
    UPDATE books.retail_price 
     SELECT CASE 
     when rating > 6 then retial_price * 2 
     when rating = 6 then retail_price *1.5 
    END 

私の選択は赤で下線が引かれ、それは私を与える「付近に正しくない構文 『を選択し』 SET期待します。。」エラー。これをどうすれば解決できますか?

+3

は、ドキュメントの 'update'構文見上げます。 –

+0

皮肉なことにその本[マニュアルです](http://dev.mysql.com/doc/refman/5.7/en/update.html) – RiggsFolly

答えて

0

あなたは実際には、すべての点についてあなたの構文についてかなり遠いです。

最初にbooksの更新をの人物ごとにに実行したいので、行トリガーを使用する必要があります。

MySQLは(ドキュメントに従って)UPDATING述語を実装していません。これをテストするための方法は、両方ともnullである場合は、1つのオペランドがnulltrueある場合falseを返すヌルセーフ比較演算子、<=>を使用することです。 (いずれかのオペランドがnullであれば、通常の=オペレータがnullを返します。)

を更新されたレコードの列にアクセスするには、MySQLはそれとして、レコードを含まOLDNEW pseudorecordsを提供であり、はそれぞれとなる。OLDNEWの列を比較すると、その列が変更されたかどうかがわかります。

おそらく、他の書籍ではなく、その著者によるすべての書籍の価格を更新したいと考えています。そのため、あなたはどちらかOLDまたはNEWで著者IDでbooks.author_idのマッチング、著者IDにごUPDATEを調整する必要があります。私はNEWを選びました。

最後に、評価によって異なる値に更新する最も簡単な方法は、単に2つのUPDATEを実行することです。

彼女は私の提案したコードです:

CREATE TRIGGER author_death 
    AFTER UPDATE 
    ON authors 
    FOR EACH ROW 
BEGIN 
    IF NOT (OLD.death <=> NEW.death) 
    THEN 
    UPDATE books 
     SET retail_price = retail_price * 2 
     WHERE rating < 6 
      AND author_id = NEW.id; 
    UPDATE books 
     SET retail_price = retail_price * 1.5 
     WHERE rating = 6 
      AND author_id = NEW.id; 
    END IF; 
END; 
0

私はIFという文でキーワードTHENEND IFが必要と思われますが、それらは見当たりません。

すべての書籍の小売価格を更新する予定か、特定の作者による書籍のみを更新する予定ですか? UPDATEステートメントでWHERE句またはその他の条件付きロジックが表示されません。

は、私はあなたのUPDATEの文の形式はなりたい疑う:...

UPDATE mytable 
    SET pricecolumn = expr 
    WHERE authorcol = somevalue 

割り当てる値を返しますexpr表現

= mytable.myprice * CASE 
         WHEN mytable.myrating < 6 THEN 2.0 
         WHEN mytable.myrating = 6 THEN 1.5 
         ELSE 1.0 
        END 

あなたはそれをテストしたい場合がありますUPDATEで使用する前にSELECTステートメントで式を使用します。

SELECT mytable.myrating 
    , mytable.myprice 
    , mytable.myprice * CASE 
          WHEN mytable.myrating < 6 THEN 2.0 
          WHEN mytable.myrating = 6 THEN 1.5 
          ELSE 1.0 
         END AS new_price 
FROM mytable 
WHERE authorcol = somevalue 
+0

これはどのようにしてトリガーの下に挿入できますか?また、助けてくれてありがとう。 –

関連する問題