MySQL 在 'table' 上更新之后/之前设置了同一 'table' 上的最后更新

标签 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.

我也不知道是否应该使用 AFTER UPDATE 还是 BEFORE UPDATE。

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

最佳答案

对于此任务,您还可以更改 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;
<小时/>

除此之外,你的触发器对我来说看起来不错。

请确保在创建触发器之前添加一个 drop trigger if isn't 语句。否则,您的触发器可能存在“先前”版本,因此更新后的触发器未按预期创建。

关于MySQL 在 'table' 上更新之后/之前设置了同一 'table' 上的最后更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52246917/

相关文章:

php - codeigniter 返回从 Controller 获取数据以通过 Ajax 请求查看

php - 控制剩余时间的输出

c# - 在 C# 中捕获 MySQL 触发信号

postgresql - 在 Postgresql 中修改触发器

jquery - 元素外部的事件触发器不会在点击时触发

mysql - 多态关系是不好的做法吗?

java - JDBC 将多个子表连接到父表,我如何知道结果行来自哪个表?

sql - 显示表中不存在的行的逗号分隔值

mysql存储过程从基于数据库的队列中弹出

mysql - 如何更改我的 sql 以在 mysql 中的 MySql 存储过程中循环?