2016-05-29 95 views
0

我有兩張表,看起來像這樣(當然他們有更多的行)。我將如何創建此觸發器?

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

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

我想要做的是有一個trigget,當有一行被刪除或插入到第二個表中時會得到更新。我想在第一個表中更新的行是第三行。這基本上代表了count(AlbumID)這也是我計算它的方式。我真的不知道該怎麼做,因爲到現在爲止我只創建了非常簡單的觸發器

+0

爲什麼不在計算選擇時計算該值? –

+0

@juergend希望表格是最新的,而不是手動更新它們,因爲行也會被程序自動刪除和插入 – Johny

+0

但是爲什麼要存儲這個值呢?如果您需要計數,那麼只需在「select」查詢中即時計算即可。 –

回答

0

這並不完全清楚爲什麼您需要首先存儲number_of_albums列。但我不會解決這個問題。我會回答你問的問題。

第二個表上的插入觸發器可以執行第一個表的更新,以增加給定author_id的number_of_albums列。我們假設第一個表的名稱是author,第二個表的名稱是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 ; 

你可以做一個刪除後觸發類似的東西,遞減number_of_albums列,引用OLD.author_id獲得被刪除的行的author_id列的值。

對於更新,如果更改了author_id列的值,則需要更新兩行......在一行上增加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 undersatand upsert? – splash58

+0

MySQL支持INSERT和UPDATE之前和之後的觸發器。 MySQL不支持「upsert」,除了'INSERT ... ON DUPLICATE KEY UPDATE'語句。 MySQL將調用適當的INSERT和/或UPDATE觸發器。 – spencer7593