2

現在、次の2つのテーブルがあります。

データ表

+-----+-------------+---------------+
| 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 |
+--------+------+----------+-----------+-------------+---------------------+

field1 または field2 2 の値を更新すると、「ログ」テーブルに、どのフィールドが、いつ、何から、何に変更されたか、および更新されたレコードの uri に関するエントリが取得されます。

私の質問は、トリガー自体に関するものです。そのままで問題ありませんか、それともより効率的に実行できますか? 正直なところ、これまでトリガーを書いたことがなく、Google で見つけたいくつかのスニペットに基づいてこれをつなぎ合わせました。ご意見/ご感想をお待ちしております。

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 ;
4

1 に答える 1

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 ;
于 2012-12-18T19:36:29.550 に答える