Что конкретно неправильно с использованием ON UPDATE CONVERT_TZ в синтаксисе?

Почему синтаксис "ON UPDATE CONVERT_TZ" не работает для колонки "updated_at", в то время как те же самые выражения для DEFAULT работают, например, "ON UPDATE NOW()"? Я хочу обновлять колонку "updated_at" без использования триггеров и учитывать временную зону.

Вот пример кода, в котором я пытаюсь использовать "ON UPDATE CONVERT_TZ":

CREATE TABLE `test` (
  `id` varchar(36) NOT NULL,
  `updated_at` datetime NOT NULL DEFAULT (CONVERT_TZ(NOW(),'UTC','Europe/Moscow')) ON UPDATE (CONVERT_TZ(NOW(),'UTC','Europe/Moscow')),
)
Изображение к вопросу
  • 13 сентября 2023 г. 11:06
Ответы на вопрос 1
Ошибка в синтаксисе заключается в том, что ключевое слово "ON UPDATE" не поддерживает функцию CONVERT_TZ напрямую. Вместо этого вы можете использовать триггер для обновления значения колонки "updated_at". Вот пример:

CREATE TABLE `test` (
  `id` varchar(36) NOT NULL,
  `updated_at` datetime NOT NULL DEFAULT (CONVERT_TZ(NOW(),'UTC','Europe/Moscow'))
);

DELIMITER $$

CREATE TRIGGER `update_test` BEFORE UPDATE ON `test`
FOR EACH ROW
BEGIN
  SET NEW.updated_at = CONVERT_TZ(NOW(),'UTC','Europe/Moscow');
END$$

DELIMITER ;

В этом примере мы создаем таблицу "test" с колонкой "updated_at" по умолчанию установленной на текущую дату и временную зону. Затем мы создаем триггер "update_test", который будет вызываться перед каждым обновлением строки в таблице "test". Внутри триггера мы устанавливаем значение новой колонки "updated_at" на текущую дату и временную зону, используя функцию CONVERT_TZ.

Таким образом, при каждом обновлении строки в таблице "test" значение колонки "updated_at" автоматически обновляется с учетом временной зоны.
Похожие вопросы