Как я могу обновить значение атрибута через триггер сразу после вставки в эту таблицу? - PullRequest
0 голосов
/ 03 декабря 2018

Это таблица, которая у меня есть.

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 голосов
/ 03 декабря 2018

Не думаю, что вам действительно нужно запускать оператор 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 ;

См. документацию для дополнительных примеров.

...