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 71

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() только один раз для каждого запроса.