Mysql ПРИ ОБНОВЛЕНИИ CURRENT_TIMESTAMP против триггера, который устанавливает время на now () после обновления

#mysql #database-trigger

#mysql #database-trigger

Вопрос:

При поиске чего-то еще я нашел этот триггер в нашей тестовой базе данных:

 begin
     set NEW.UpdatedAt = now();
end
  

Я озадачен… Отличается ли это от изменения определения столбца на следующее?

 alter table TableName change UpdatedAt ON UPDATE CURRENT_TIMESTAMP;
  

Есть ли какие-либо преимущества, которые я не вижу в выполнении этого в триггере?

Комментарии:

1. Трудно сказать, не видя остальной структуры таблицы. Более старые версии MySQL (я думаю, до версии 5.6) не могли поддерживать как текущую временную метку для вставки строки, так и отдельный столбец для обновления временной метки для последнего изменения. Это могло быть обходным путем. Лично я бы предпочел видеть это в ON UPDATE атрибуте, чем в триггере, который в основном невидим.

Ответ №1:

Для более ранних версий MySQL ON UPDATE был доступен только для столбцов типа данных TIMESTAMP . Эта функциональность не поддерживалась для DATETIME или любых других типов данных.

И с TIMESTAMP столбцами может быть довольно сложно определить таблицу с двумя TIMESTAMP столбцами, которые будут автоматически установлены; чтобы они были NOW() назначены одному столбцу при вставке строки, и чтобы они были NOW() назначены другому столбцу при обновлении строки.

Триггеры могут обойти эти ограничения.

Комментарии:

1. Спасибо за ваш ответ! Один последующий вопрос: о каком возрасте мы говорим? Я думаю, что мы запускаем 5.6 уже довольно давно. Из того, что я прочитал, проблема старше этого… Возможно, старая привычка разработчиков.

2. Я знаю, что MySQL 5.1 не поддерживал автоматическое обновление для типа данных DATETIME, только для метки ВРЕМЕНИ. (Я не уверен насчет 5.5) Это автоматическое обновление столбцов TIMESTAMP (а теперь DATETIME) является специфичной функцией MySQL и недоступно в Oracle, SQL Server … поэтому другим возможным обоснованием триггеров является то, что разработчик был знаком с этим шаблоном из другой СУБД, или дизайн базы данных был перенесен из другой СУБД.