这是我的表“员工”:
+----------------+--------------+------+-----+-------------------+-------+
| 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/