在更新更改触发期间保存上次更新的ID和日期更新

时间:2011-07-30 19:57:19

标签: mysql triggers

我有一个drivers表,其中包含以下字段:

driver_id
first_name
last_name
nationality
dob
last_update_id
last_update_datetime

我想将旧数据保存到drivers_history表,该表几乎是该表的镜像副本,然后将该行的id和datetime返回给{{1}无论何时对数据进行更新,都会在driverslast_update_id字段中添加表格。

到目前为止,我有以下代码用于触发器,但我对MySQL的了解仅限于ASP.Net/SQL Server背景。

last_update_datetime

我不知道这段代码是否有效但是我到目前为止所处的位置。请有人帮我填写剩下的部分吗?

首次尝试重触搜索

DROP TRIGGER IF EXISTS history_trigger $$

CREATE TRIGGER drivers_history_trigger
BEFORE UPDATE ON drivers
  FOR EACH ROW
  BEGIN
    DECLARE _count INT;
    IF OLD.first_name != NEW.first_name THEN _count = _count + 1 END IF;
    IF OLD.last_name != NEW.last_name THEN _count = _count + 1 END IF;
    IF OLD.nationality != NEW.nationality THEN _count = _count + 1 END IF;
    IF OLD.dob != NEW.dob THEN _count = _count + 1 END IF;

    IF _count > 0
    THEN
      INSERT INTO drivers_history (
        first_name,
        last_name,
        nationality,
        dob,
        last_update_id,
        last_update_datetime
      ) 
      VALUES (
        NEW.first_name,
        NEW.last_name,
        NEW.nationality,
        NEW.dob,
        NULL,
        NULL
      );
    END IF;
  END;
$$

1 个答案:

答案 0 :(得分:1)

首先

DECLARE _count INT;
根据{{​​3}},

必须为declare _count INT DEFAULT 0,未指定default值表示变量值为NULLNULL + something_numericNULL

如果您要保存旧数据,则必须将insert语句重写为:

INSERT INTO drivers_history (
        first_name,
        last_name,
        nationality,
        dob,
        last_update_id,
        last_update_datetime
      ) 
      VALUES (
        old.first_name,
        old.last_name,
        old.nationality,
        old.dob,
        NULL,
        NULL
      );

我想澄清last_update_id的含义是什么?我猜last_update_datetime的类型为TIMESTAMP,如果您已在该表的创建表语句中指定,则会自动更新。同时为最后两个字段的值提供NULL将阻止您正确检索,因为一旦您查询drivers_history,您将获得两个值NULL,所以对我来说没有多大意义