mysql 触发器示例 - 这可以更有效地完成吗?

标签 mysql triggers

我目前有两个表,如下:

数据表

+-----+-------------+---------------+
| 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 两个值时,我会在“日志”表中获得一个条目,其中包含更改的字段、从什么更改为什么、何时以及更新的记录的 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 ;

最佳答案

您应该消除多余的查询:

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 ;

关于mysql 触发器示例 - 这可以更有效地完成吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13940033/

相关文章:

mysql - 我的触发语句有问题吗?

mysql - SQL 按日期降序排序表达式

mysql - SQL Select Data 具有多行条件

sql - pl/sql中有BEFORE SELECT触发器吗?

sql - 更新闭包表的最佳方法是什么?

用于自动递增 varchar(不是主键)的 MySQL 触发器

mysql - ER 模型的未知部分

php - 使用 PHP 锁定 MYSQL 表

mysql - 这个 MySQL 查询有什么错误?

sql - 如何在实际项目中使用数据库触发器?