Мне нужно обновить 2 столбца datetime, и мне нужно, чтобы они были точно такими же, используя mysql версии 4.1.20. Я использую этот запрос:
mysql> update table set last_update=now(), last_monitor=now() where id=1;
Это безопасно или есть вероятность, что столбцы обновляются с разным временем из-за 2 видимых вызовов now()
?
Я не думаю, что его можно обновить с разными значениями (я думаю, что внутренне mysql вызывает now()
только один раз для каждой строки или что-то подобное), но я не эксперт, как вы думаете?
Обновление: здесь был извлечен второй вопрос .
mysql
sql-update
Раду Марис
источник
источник
Ответы:
Нашел решение:
mysql> UPDATE table SET last_update=now(), last_monitor=last_update WHERE id=1;
Я нашел это в MySQL Docs, и после нескольких тестов он работает:
источник
Mysql не очень умен. Если вы хотите использовать одну и ту же метку времени в нескольких запросах на обновление или вставку, вам необходимо объявить переменную.
Когда вы используете
now()
функцию, система будет вызывать текущую отметку времени каждый раз, когда вы вызываете ее в другом запросе.источник
MySQL оценивает now () один раз для каждого оператора, когда оператор начинает выполнение. Поэтому безопасно иметь несколько видимых вызовов now () для каждого оператора.
select now(); select now(), sleep(10), now(); select now(); +---------------------+ | now() | +---------------------+ | 2018-11-05 16:54:00 | +---------------------+ 1 row in set (0.00 sec) +---------------------+-----------+---------------------+ | now() | sleep(10) | now() | +---------------------+-----------+---------------------+ | 2018-11-05 16:54:00 | 0 | 2018-11-05 16:54:00 | +---------------------+-----------+---------------------+ 1 row in set (10.00 sec) +---------------------+ | now() | +---------------------+ | 2018-11-05 16:54:10 | +---------------------+ 1 row in set (0.00 sec)
источник
Вы можете сохранить значение now () в переменной перед запуском запроса на обновление, а затем использовать эту переменную для обновления полей
last_update
иlast_monitor
.Это гарантирует, что now () выполняется только один раз, и одно и то же значение обновляется в обоих столбцах, которые вам нужны.
источник
Вы можете поместить следующий код в значение по умолчанию для столбца отметки времени:,
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()
только один раз за запрос.источник
Для этого есть 2 способа;
Во-первых , я бы посоветовал вам объявить now () как переменную, прежде чем вставлять ее в оператор sql. Скажем так;
var x = now(); mysql> UPDATE table SET last_update=$x, last_monitor=$x WHERE id=1;
По логике вещей, если вам нужен другой ввод для last_monitor, вы добавите еще одну переменную, например:
var y = time(); mysql> UPDATE table SET last_update=$x, last_monitor=$y WHERE id=1;
Таким образом, вы можете использовать переменные столько раз, сколько сможете, не только в операторах mysql, но и на серверном языке сценариев (например, PHP), который вы используете в своем проекте. Помните, что эти же переменные могут быть вставлены в качестве входных данных в форму во внешнем интерфейсе приложения. Это делает проект динамичным, а не статичным.
Во-вторых, если now () указывает время обновления, то с помощью mysql вы можете преобразовать свойство строки в метку времени. Каждый раз, когда строка вставляется или обновляется, также обновляется время.
источник