2012-12-18 18 views
2

我現在有兩個表如下:mysql觸發器示例 - 可以更有效地完成此操作嗎?

數據表

+-----+-------------+---------------+ 
| uri | field1  | field2  | 
+-----+-------------+---------------+ 
| 1 | word  | somethingelse | 
| 2 | somethinge | values  | 
| 3 | change_this | test   | 
+-----+-------------+---------------+ 

日誌表

+--------+------+----------+-----------+-------------+---------------------+ 
| log_id | uri | field_id | old_value | new_value | modified_date  | 
+--------+------+----------+-----------+-------------+---------------------+ 
|  14 | 3 | field1 | word32 | change_this | 2012-12-18 13:06:27 | 
+--------+------+----------+-----------+-------------+---------------------+ 

當我更新的場1或場兩個值,我得到了一個進入我的'登錄'表,關於哪個字段被更改,從什麼到什麼,何時以及更新的記錄的URI。

我的問題是關於觸發器本身:它可以保持原樣,還是可以更有效地完成?我真的從來沒有寫過觸發器,並根據谷歌發現的幾個片段拼湊起來。我歡迎您的想法/反饋。

DELIMITER $$ 
DROP TRIGGER IF EXISTS trig_update $$ 
CREATE TRIGGER trig_update AFTER UPDATE on data 
FOR EACH ROW 
BEGIN 
DECLARE data_uri VARCHAR(32); 
IF (NEW.field1 != OLD.field1) THEN 
SET data_uri = (SELECT uri FROM data WHERE field1 = NEW.field1); 
INSERT INTO log (uri, field_id, old_value, new_value, modified_date) 
VALUES (data_uri, "field1", OLD.field1, NEW.field1, NOW()); 
END IF; 
IF (NEW.field2 != OLD.field2) THEN 
SET data_uri = (SELECT uri FROM data WHERE field2 = NEW.field2); 
INSERT INTO log (uri, field_id, old_value, new_value, modified_date) 
VALUES (data_uri, "field2", OLD.field2, NEW.field2, NOW()); 
END IF; 
END$$ 
DELIMITER ; 
+0

更新:我已經看到了一個問題與此有關。如果我碰到一個情況,我有不止一行具有相同的值,我越來越。 錯誤1242(21000):子查詢返回多於1行。 看起來我需要一種不同的方式來從正在更新的行中的數據表中拉出'uri'字段。有什麼想法嗎? – ivorytux

回答

4

你應該消除冗餘查詢:

DELIMITER $$ 
DROP TRIGGER IF EXISTS trig_update $$ 
CREATE TRIGGER trig_update AFTER UPDATE on data 
FOR EACH ROW 
BEGIN 
IF (NEW.field1 != OLD.field1) THEN 
    INSERT INTO log (uri, field_id, old_value, new_value, modified_date) 
    VALUES (NEW.uri, "field1", OLD.field1, NEW.field1, NOW()); 
END IF; 
IF (NEW.field2 != OLD.field2) THEN 
    INSERT INTO log (uri, field_id, old_value, new_value, modified_date) 
    VALUES (NEW.uri, "field2", OLD.field2, NEW.field2, NOW()); 
END IF; 
END$$ 
DELIMITER ; 
相關問題