mysql обновляет несколько столбцов с тем же сейчас()
мне нужно обновить 2 столбца datetime, и мне нужно, чтобы они были точно такими же, используя версию mysql 4.1.20. Я использую этот запрос:
mysql> update table set last_update=now(), last_monitor=now() where id=1;
это безопасно или есть шанс, что столбцы обновляются с разным временем, из-за 2 видимых вызовов now()
?
Я не думаю, что это может быть обновление с разными значениями (я думаю, что внутренне mysql вызывает now()
только один раз в строке или что-то подобное), но я не специалист, как вы думаешь?
второй вопрос, почему этот запрос не обновляет столбцы:
mysql> update table set last_update=last_monitor=now() where id=1;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1 Changed: 0 Warnings: 0
5 ответов:
нашел решение:
mysql> UPDATE table SET last_update=now(), last_monitor=last_update WHERE id=1;
нашел этой в MySQL Docs и после нескольких тестов он работает:
следующий оператор устанавливает col2 в текущее (обновленное) значение col1, а не исходное значение col1. В итоге получается, что col1 и col2 имеют одинаковое значение. Это поведение отличается от стандартного SQL.
обновление T1 SET col1 = col1 + 1, col2 = col1;
по второму вопросу, не надо есть какие-либо ответы, не нашел ничего на mysql docs об этом.
Mysql не очень умный. Если вы хотите использовать одну и ту же метку времени в нескольких запросах update или insert, необходимо объявить переменную.
при использовании
now()
функция, система будет вызывать текущую метку времени каждый раз, когда вы вызываете ее в другом запросе.
вы можете сохранить значение now () в переменной перед запуском запроса на обновление, а затем использовать эту переменную для обновления обоих полей
last_update
иlast_monitor
.это гарантирует, что now () выполняется только один раз, и одно и то же значение обновляется в обоих столбцах, которые вам нужны.
вы можете поместить следующий код в значение по умолчанию столбца timestamp:
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
, поэтому при обновлении два столбца принимают одно и то же значение.
Если вам действительно нужно быть уверенным, что
now()
имеет то же значение, что вы можете запустить два запроса (что ответит на ваш второй вопрос тоже, в этом случае вы проситеupdate last_monitor = to last_update
ноlast_update
еще не обновлен)вы могли бы сделать что-то вроде:
mysql> update table set last_update=now() where id=1; mysql> update table set last_monitor = last_update where id=1;
в любом случае я думаю, что mysql достаточно умен, чтобы попросить
now()
только один раз для каждого запроса.