2016-05-29 1 views
0

私はこれのように見える2つのテーブルを持っています(もちろん、もっと多くの行があります)。このトリガーはどのように作成しますか?

AuthorID | Name   | Number of albums 
------------------------------------------- 
1  | Santana  | 39 
2  | Johnny Cash | 95 

AuthorID | AlbumID  
---------------------- 
1  | 14  
2  | 17 

私がしたいのは、削除または2番目のテーブルに挿入された行がある場合に更新されるトリガットを持つことです。最初のテーブルで更新したい行は3行目です。基本的にはcount(AlbumID)を表していますが、これもどのように計算したのですか。今まで私は本当にシンプルなトリガーを作成して以来、私はそれをどうやって行うのか本当に分かりません

+0

なぜ、選択時に必要なときにその値を計算しないのですか? –

+0

@juergendテーブルを最新の状態にして、手動で更新しないようにしたい場合は、行を削除してプログラムに自動的に入力してください。 – Johny

+0

なぜ値を保存するのですか?カウントが必要な場合は、 'select'クエリでオンザフライで計算してください。 –

答えて

0

最初にnumber_of_albums列を保存する必要がある理由はまったく明確ではありません。しかし、私はその質問に対処しません。あなたが尋ねた質問に私は答えます。

2番目のテーブルのafter insertトリガーは、最初のテーブルを更新して、指定されたauthor_idのnumber_of_albums列を増やすことができます。最初のテーブルの名前がauthorで、2番目のテーブルの名前がalbumであると仮定します。

DELIMITER $$ 

CREATE TRIGGER album_ai 
AFTER INSERT ON album 
FOR EACH ROW 
BEGIN 
    UPDATE author 
     SET number_of_albums = number_of_albums + 1 
    WHERE author_id = NEW.author_id; 
END$$  

DELIMITER ; 

あなたは、削除された行のauthor_id列の値を取得するためにOLD.author_idを参照number_of_albums列を、デクリメント、削除トリガーの後で同様の何かができます。

author_id列の値が変更された場合は、2つの行を更新する必要があります.1つの行でnumber_of_albumsを増やし、もう一方の行でnumber_of_albumsを減らします。

DELIMITER $$ 

CREATE TRIGGER album_ai 
AFTER UPDATE ON album 
FOR EACH ROW 
BEGIN 
    IF NOT (NEW.author_id <=> OLD.author_id) THEN 
    UPDATE author 
     SET number_of_albums = number_of_albums - 1 
     WHERE author_id = OLD.author_id; 
    UPDATE author 
     SET number_of_albums = number_of_albums + 1 
     WHERE author_id = NEW.author_id; 
    END IF; 
END$$  

DELIMITER ; 
+0

は、トリガでmysqlアンダーサートアップを行いますか? – splash58

+0

MySQLは、INSERTとUPDATEの両方のBEFOREとAFTERの両方のトリガをサポートしています。 MySQLは、 "INSERT ... ON DUPLICATE KEY UPDATE"ステートメントを除いて、 "upsert"をサポートしていません。 MySQLは適切なINSERTおよび/またはUPDATEトリガーを呼び出します。 – spencer7593

関連する問題