我有一个drivers
表,其中包含以下字段:
driver_id
first_name
last_name
nationality
dob
last_update_id
last_update_datetime
我想将旧数据保存到drivers_history
表,该表几乎是该表的镜像副本,然后将该行的id和datetime
返回给{{1}无论何时对数据进行更新,都会在drivers
和last_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;
$$
答案 0 :(得分:1)
首先
DECLARE _count INT;
根据{{3}},必须为declare _count INT DEFAULT 0
,未指定default
值表示变量值为NULL
且NULL
+ something_numeric
为NULL
。
如果您要保存旧数据,则必须将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
,所以对我来说没有多大意义