2012-04-14 76 views
1

我正在使用MySQL 5.5。我需要一個觸發添加到用mysql觸發器語法我的表:http://dev.mysql.com/doc/refman/5.0/en/trigger-syntax.htmlMYSQL觸發器 - 如何存儲計算字段的結果

他們給不解釋我怎麼能去這樣做的例子 -

我有一個表 - table(a INT, b INT, c INT);。字段ab是數字,而字段c應該是a + b。現在我確定你想知道爲什麼不把它放在視圖中並且用它來做,或者爲什麼不把它放在我的代碼中。原因是因爲我正在和一個需要方便的自動計算領域的客戶合作,並且有能力修改它需要變化的價值。他們是一個審計公司和按摩的數字往往是必需的,因爲公司缺少審覈日期等

所以,我怎麼可以創建一個觸發器,它會:

on insert: 
make `c` the value of `a` + `b`. 

on update: 
if the value of NEW.`c`==OLD.`c` THEN 
make `c` the value of `a` + `b`. 
ELSE 
no change 

的原因更新不改變,如果新值與舊值不同是因爲這意味着他們想要修改數字與實際總和略有不同。

請隨時更改我的邏輯 - 我的目標是保留c的值(如果已手動輸入),並在未手動觸摸的情況下進行爆破。

謝謝!

回答

0

我知道這是一個古老的問題,但如果答案仍然需要在這裏。

首先爲表單添加了一個id列,以便進行更直接的更新。

CREATE TABLE table1 
(
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    a INT, b INT, c INT 
); 

現在INSERT觸發器的邏輯被修改,允許預先計算的值的插入到C柱。

CREATE TRIGGER tg_table1_before_insert 
BEFORE INSERT ON table1 
FOR EACH ROW 
    SET NEW.c = IF(NEW.c IS NULL, NEW.a + NEW.b, NEW.c); 

的更新觸發,實現根據您的要求的邏輯

CREATE TRIGGER tg_table1_before_update 
BEFORE UPDATE ON table1 
FOR EACH ROW 
    SET NEW.c = IF(NEW.c <=> OLD.c, NEW.a + NEW.b, NEW.c); 

現在讓我們做一些插入和更新

INSERT INTO table1 (a, b) VALUES (1, 2), (3, 4); 
INSERT INTO table1 (a, b, c) VALUES (5, 6, 0), (7, 8, 100); 
UPDATE table1 SET c = 25 WHERE id = 2; 
UPDATE table1 SET c = c WHERE id = 3; 

因此,我們有

 
| ID | A | B | C | 
-------------------- 
| 1 | 1 | 2 | 3 | -- calculated on insert 
| 2 | 3 | 4 | 25 | -- explicitly set on update 
| 3 | 5 | 6 | 11 | -- re-calculated on update 
| 4 | 7 | 8 | 100 | -- explicitly set on insert 

這裏是SQLFiddle demo