Переменная силы MySQL для пересчета

#mysql #variables #mariadb

Вопрос:

Я использую планировщик событий MySQL для выполнения кода через регулярные промежутки времени, то есть каждый день или каждый час. В своем коде я использую » CURDATE()» и присваиваю это переменной. К сожалению, MySQL вычисляет это только в первом случае. Он не пересчитывает его в течение каждой итерации, что означает, что при первом прохождении у него будет правильная дата, но каждый раз после этого у него будет неправильная дата. То же самое происходит, если я запускаю код вручную, т. Е. без планировщика событий.

Как я могу заставить MySQL пересчитать переменные заново?

Я пробовал это (это работает только в первый раз):

 SET @stmt := CONCAT('ALTER TABLE myTable ADD myColum_', DATE_FORMAT(NOW(), '%Y_%M_%D_%H_%m'), ' SMALLINT(5);');
PREPARE stmt from @stmt;
EXECUTE stmt;
 

И это (это даже не работает в первый раз):

 PREPARE stmt from ALTER TABLE myTable ADD
CONCAT('myColumn_', DATE_FORMAT(NOW(), '%Y_%M_%D_%H_%mm'), '
SMALLINT(5);'); EXECUTE stmt;
 

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

1. если вы хотите CURDATE() всегда получать последнее значение, вам следует просто заменить использование переменной на CURDATE() саму себя, что позволит ей всегда получать последнее значение.

2. УСТАНОВИТЕ @stmt := CONCAT(«ИЗМЕНИТЬ ТАБЛИЦУ myTable, ДОБАВИТЬ столбец_», ФОРМАТ ДАТЫ(СЕЙЧАС(), «%Y_%M_%D_%H_%m»), » SMALLINT(5);»); ПОДГОТОВЬТЕ stmt из @stmt; ВЫПОЛНИТЕ stmt;

3. Я не могу найти, как сделать то, что я хочу, без использования переменной

4. можете ли вы обновить вопрос, чтобы включить полный фрагмент кода, было бы проще помочь таким образом.

5. ‘:=’ кажется излишним в этом контексте. Конечно, » = » было бы достаточно.

Ответ №1:

Таким образом, у вас есть две проблемы NOW() , возвращающие время в начале соединения, независимо от того, сколько операторов выполнено. CURDATE() однако всегда будет актуальным.

Синтаксис в таблице ALTER не может принимать произвольные выражения.

Что вы можете сделать, так это использовать ВЫПОЛНИТЬ НЕМЕДЛЕННО:

 EXECUTE IMMEDIATE
  CONCAT('ALTER TABLE myTable ADD myColum_',
         DATE_FORMAT(CURDATE(), '%Y_%M_%D_%H_%m'),
         ' SMALLINT(5);')
 

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

1. На меня это не действует. Я использую версию 5.2, поэтому я думаю, что именно поэтому

2. Вы можете использовать CURDATE() в своих подготовленных заявлениях. Как правило, если вы используете что-то действительно старое и неподдерживаемое, вам, вероятно, следует упомянуть его версию в своем вопросе. Вышесказанное относится к 10.2, самой низкой стабильной серии GA на момент ответа.

3. Действительно ли это не поддерживается? Я этого не понимал. То есть, по сути, мне нужно изменить всю операционную систему, чтобы просто обновить переменную?

4. Где говорится, что он не поддерживается и не поддерживается для чего именно?

5. Неужели нет другого способа достичь этого? Это не обязательно должно быть свидание. Это может быть просто другое значение. Мне просто нужно, чтобы каждый раз, когда запускается событие, новому столбцу присваивалось другое название.