MySQL обновить несколько столбцов с тем же теперь () - PullRequest
76 голосов
/ 27 сентября 2010

Мне нужно обновить 2 столбца datetime, и мне нужно, чтобы они были точно такими же, используя версию 4.1.20 mysql.Я использую этот запрос:

mysql> update table set last_update=now(), last_monitor=now() where id=1;

Это безопасно или есть вероятность, что столбцы обновляются с различным временем из-за 2 видимых вызовов now()?
Я не думаю, что его можно обновить с другими значениями (я думаю, что внутренне mysql вызывает now() только один раз в строке или что-то подобное), но я не эксперт, как вы думаете?Обновление: Второй вопрос был извлечен здесь .

Ответы [ 7 ]

128 голосов
/ 27 сентября 2010

Нашли решение:

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;

7 голосов
/ 27 ноября 2013

Mysql не очень умный.Если вы хотите использовать одну и ту же метку времени в нескольких запросах на обновление или вставку, вам нужно объявить переменную.

Когда вы используете функцию now(), система будет вызывать текущую временную метку каждый раз, когда вы вызываете ее в другом запросе.

1 голос
/ 06 ноября 2018

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)
1 голос
/ 25 января 2012

Вы можете поместить следующий код в значение по умолчанию для столбца отметки времени: CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, поэтому при обновлении два столбца принимают одинаковое значение.

1 голос
/ 27 сентября 2010

Вы можете сохранить значение now () в переменной перед запуском запроса на обновление, а затем использовать эту переменную для обновления обоих полей last_update и last_monitor.

Это обеспечит выполнение now () только один раз, и в обоих нужных столбцах будет обновлено одно и то же значение.

0 голосов
/ 14 ноября 2018

Есть 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 вы можете удалить свойство строки как метку времени. Каждый раз, когда вставляется или обновляется строка, также обновляется время.

0 голосов
/ 27 сентября 2010

Если вам действительно нужно убедиться, что 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() только один раз на запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...