MySQL – триггер для обновления той же таблицы после вставки

Вот что я пытаюсь сделать:

Когда в таблице ACCOUNTS появляется новый INSERT , мне нужно обновить строку в ACCOUNTS где pk = NEW.edit_on , установив status='E' чтобы NEW.edit_on , что конкретная (старая) учетная запись была отредактирована.

 DELIMITER $$ DROP TRIGGER IF EXISTS `setEditStatus`$$ CREATE TRIGGER `setEditStatus` AFTER INSERT on ACCOUNTS FOR EACH ROW BEGIN update ACCOUNTS set status='E' where ACCOUNTS.pk = NEW.edit_on ; END$$ DELIMITER ; 

Требование НЕ заключается в том, что я манипулирую недавно вставленным столбцом, но уже существующий столбец с pk = NEW.edit_on

Однако я не могу обновить одну и ту же таблицу: Can't update table ACCOUNTS ... already used by the statement that invoked this trigger

Пожалуйста, предложите обходной путь

PS: Я уже прошел Обновление таблицы в триггере после обновления в той же таблице , Insert в ту же таблицу trigger mysql , Update with после триггера insert в той же таблице и триггер mysql с вставкой и обновлением после вставки в таблицу, но они, похоже, не отвечают мой вопрос.

редактировать

Таблица ACCOUNTS :

 CREATE TABLE `ACCOUNTS` ( `pk` bigint(10) unsigned NOT NULL AUTO_INCREMENT, `user_id` bigint(9) unsigned NOT NULL, `edit_on` bigint(10) unsigned DEFAULT NULL, `status` varchar(1) NOT NULL DEFAULT 'A', PRIMARY KEY (`pk`) USING BTREE) ENGINE=InnoDB AUTO_INCREMENT=2147483726 DEFAULT CHARSET=latin1 

Кажется, что вы не можете сделать все это в триггере. Согласно документации :

Внутри хранимой функции или триггера не разрешается изменять таблицу, которая уже используется (для чтения или записи) оператором, вызывающим функцию или триггер.

Согласно этому ответу , кажется, что вы должны:

создать хранимую процедуру, которая вставляет / обновляет целевую таблицу, а затем обновляет другую строку (строки), все в транзакции.

С сохраненным proc вы вручную зафиксируете изменения (вставить и обновить). Я не делал этого в MySQL, но этот пост выглядит как хороший пример.

Вот как я обновляю строку в одной и той же таблице при вставке

activationCode и email – это строки в таблице USER. При вставке я не указываю значение для кода активации, оно будет создано на лету mysql.

Измените «имя пользователя» на свое имя пользователя mysql и «db_name» с вашим именем db.

 CREATE DEFINER=`username`@`localhost` TRIGGER `db_name`.`user_BEFORE_INSERT` BEFORE INSERT ON `user` FOR EACH ROW BEGIN SET new.activationCode = MD5(new.email); END 

Имела та же самая проблема, но мне пришлось обновить столбец с идентификатором, который должен был войти, поэтому вы можете сделать обновление, которое должно быть выполнено ДО и ПОСЛЕ не до того, как не было идентификатора, поэтому я сделал этот трюк

 DELIMITER $$ DROP TRIGGER IF EXISTS `codigo_video`$$ CREATE TRIGGER `codigo_video` BEFORE INSERT ON `videos` FOR EACH ROW BEGIN DECLARE ultimo_id, proximo_id INT(11); SELECT id INTO ultimo_id FROM videos ORDER BY id DESC LIMIT 1; SET proximo_id = ultimo_id+1; SET NEW.cassette = CONCAT(NEW.cassette, LPAD(proximo_id, 5, '0')); END$$ DELIMITER ; 

На последней записи; это еще один трюк:

 SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_schema = ... and table_name = ... 

Вместо этого вы можете использовать до вставки и получить max pkid для конкретной таблицы, а затем обновить максимальную запись таблицы pkid.

  • MySQL Orderby число, Nulls last
  • MySQL Рассчитать процент
  • MySQL - Постоянное соединение и объединение пулов
  • Как установить значение по умолчанию для столбца MySQL Datetime?
  • Выбор столбцов в разных базах данных
  • Есть ли способ «ограничить» результат с помощью ELOQUENT ORM Laravel?
  • Самый быстрый способ найти расстояние между двумя лат / длинными точками
  • Force InnoDB перепроверять foreign keys на столе / таблицах?
  • Иерархические запросы в MySQL
  • Аутентификация со старым паролем больше не поддерживается, используйте пароли типа 4.1
  • Как запустить SQL-скрипт в MySQL?
  • Давайте будем гением компьютера.