MySQL在“表”上更新之前/之后设置了在同一“表”上的最后更新

时间:2018-09-09 17:18:49

标签: mysql database triggers

这是我的表“员工”:

+----------------+--------------+------+-----+-------------------+-------+
| Field          | Type         | Null | Key | Default           | Extra |
+----------------+--------------+------+-----+-------------------+-------+
| employeeNumber | int(11)      | NO   | PRI | NULL              |       |
| lastName       | varchar(50)  | NO   |     | NULL              |       |
| firstName      | varchar(50)  | NO   |     | NULL              |       |
| extension      | varchar(10)  | NO   |     | NULL              |       |
| email          | varchar(100) | NO   |     | NULL              |       |
| officeCode     | varchar(10)  | NO   |     | NULL              |       |
| reportsTo      | int(11)      | YES  |     | NULL              |       |
| jobTitle       | varchar(50)  | NO   |     | NULL              |       |
| age            | int(11)      | YES  |     | NULL              |       |
| lastUpdate     | timestamp    | NO   |     | CURRENT_TIMESTAMP |       |
+----------------+--------------+------+-----+-------------------+-------+

我开始学习MySQL中的触发器。 我的想法是,当我更新员工时,我想在lastUpdate中设置当前日期 所以我试图做一个简单的:

DELIMITER $$
CREATE TRIGGER lastUpdate_employee
BEFORE UPDATE
   ON employees FOR EACH ROW
BEGIN
    SET new.lastUpdate = CURRENT_TIMESTAMP;
END; 
$$
DELIMITER ;

我可以创建没有错误的触发器,但是当我尝试更新员工时会给我一个错误:

ERROR 1442 (HY000): Can't update table 'employees' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

我也不知道应该使用更新后还是更新前。

抱歉,这是一个基本错误,但我不知道如何解决。 谢谢。

1 个答案:

答案 0 :(得分:0)

对于此任务,您还可以更改strdup语句,并定义要随其他任何列的每次“更新”自动更新的列:

(请注意CREATE TABLE部分)

ON UPDATE CURRENT_TIMESTAMP

当然,您也可以更改现有表:

CREATE TABLE `test` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `lastChange` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 `text` varchar(200) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

除此之外,您的触发器对我来说还不错。

请确保在创建触发器之前,添加ALTER TABLE test MODIFY COLUMN lastChange TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP; 语句。否则,可能存在触发器的“先前”版本,因此未按预期创建更新的触发器。