在插入表之后,如何通过触发器立即更新属性的值?

时间:2018-12-03 05:36:32

标签: mysql database-trigger

这是我的桌子。

CREATE TABLE `employees` (
id INT(4) NOT NULL AUTO_INCREMENT,
employee_id VARCHAR(10) null,
employee_email VARCHAR(30) NOT NULL,
employee_first_name VARCHAR(30) NOT NULL,
employee_last_name VARCHAR(30) NOT NULL,
PRIMARY KEY (id),
UNIQUE (employee_id));

这是我正在使用的触发器。

delimiter $$
create trigger employee_id_update_trigger
after insert on employees
   for each row  
        begin
           update employees set new.employee_id= concat('ecl-emp-',id) 
           where id=LAST_INSERT_ID();
        end$$ 
delimiter ;

这是我要尝试的插入。

INSERT INTO `employees` 
VALUES (1,null,'abc@gmail.com','ABC','DEF');

我得到的错误如下。

11:29:16    INSERT INTO `employees`  VALUES  (1,null,'abc@gmail.com','ABC','DEF')   Error Code: 1442. Can't update table 'employees' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 1.282 sec

1 个答案:

答案 0 :(得分:1)

如果您只想更改update之前的值,我认为您实际上不需要运行insert语句。您应该只可以使用set。即使可行,但我不确定如果同时发生大量插入操作,您不确定使用LAST_INSERT_ID的尝试是否安全。

我认为您的语法应类似于:

CREATE TRIGGER employee_id_update_trigger BEFORE INSERT ON employees
FOR EACH ROW SET NEW.employee_id=concat('ecl-emp-',NEW.id);

delimiter $$
create trigger employee_id_update_trigger
before insert on employees
   for each row  
        begin
           SET NEW.employee_id=concat('ecl-emp-',NEW.id);
        end$$ 
delimiter ;

有关更多示例,请参见the documentation