MySQL после / до обновления на «таблице» установить последнее обновление на той же «таблице» - PullRequest
0 голосов
/ 09 сентября 2018

Это мой стол «сотрудники»:

+----------------+--------------+------+-----+-------------------+-------+
| 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.

Я также не знаю, следует ли мне использовать ПОСЛЕ ОБНОВЛЕНИЯ или ПЕРЕД ОБНОВЛЕНИЕМ.

Извините, если это основная ошибка, но я не знаю, как ее решить. Спасибо.

1 Ответ

0 голосов
/ 09 сентября 2018

Для этой задачи вы также можете изменить свой оператор 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 exists. В противном случае «предыдущая» версия вашего триггера может существовать, поэтому ваш обновленный триггер был создан не так, как ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...