mysql оновити кілька стовпців тим же самим зараз ()


87

Мені потрібно оновити 2 стовпці часу та дати, і вони повинні бути абсолютно однаковими, використовуючи mysql версії 4.1.20. Я використовую цей запит:

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

Це безпечно, або є ймовірність того, що стовпці оновлюються з різним часом, через 2 видимі дзвінки до now()?
Я не думаю, що його можна оновити з різними значеннями (я думаю, що внутрішньо виклики mysql проводяться now()лише один раз на рядок чи щось подібне), але я не фахівець, що ви думаєте?

Оновлення: Друге питання екстрагували тут .


1
Я пропоную вам видалити своє друге запитання звідси і врешті-решт розмістити його в окремому дописі.
Cœur

Відповіді:


144

Знайшли рішення:

mysql> UPDATE table SET last_update=now(), last_monitor=last_update WHERE id=1;

Я знайшов це в MySQL Docs, і після кількох тестів це працює:

наступний оператор встановлює для col2 поточне (оновлене) значення col1, а не вихідне значення col1. Результатом є те, що col1 та col2 мають однакове значення. Ця поведінка відрізняється від стандартного SQL.

ОНОВИТИ t1 ВСТАНОВИТИ col1 = col1 + 1, col2 = col1;


Чи є спосіб, щоб це не спрацювало? У процедурі чи за допомогою об'єднання з тимчасовими таблицями?
Сохейл Рахсаз,

7

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

Коли ви використовуєте now()функцію, система буде викликати поточну мітку часу кожного разу, коли ви викликаєте її в іншому запиті.


5

MySQL обчислює зараз () один раз на оператор, коли оператор починає виконання. Тож безпечно мати декілька викликів, що відображаються зараз () на оператор.

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

Ви можете зберегти значення зараз () у змінній перед запуском запиту на оновлення, а потім використати цю змінну для оновлення полів last_updateта last_monitor.

Це забезпечить виконання команди now () лише один раз, і одне і те ж значення оновиться в обох потрібних стовпцях.


1

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


1
AFAIK "при оновленні" має обмеження в одному стовпці для таблиці, тому не може встановити його для обох стовпців.
Раду Маріс

0

Якщо вам дійсно потрібно бути впевненим, що 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()лише один раз за запит.


Як щодо двох оновлень? ти також здогадуєшся, що mysql досить розумний, щоб об'єднати їх в одне твердження? тому що це не буде.
Рафаель Герсковічі

0

Є 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), яку ви використовуєте у своєму проекті. Пам’ятайте, ці самі змінні можна вставити як вхідні дані у формі на передній частині програми. Це робить проект динамічним, а не статичним.

По-друге, якщо зараз () вказує час оновлення, то за допомогою mysql ви можете відмінити властивість рядка як позначку часу. Кожен раз, коли вставляється рядок або оновлюється час, також оновлюється.


Ласкаво просимо до SO. Хоча це рішення проблеми, воно насправді не відповідає на запитання: "Чи є проблема із використанням вбудованої функції mysql NOW ()?". Також ви пропонуєте використовувати зовнішню мову, над якою плакат може не контролювати. Ваша друга пропозиція, в якій я не впевнений (моє спогадування про mysql не таке детальне), але підтримка посилань на деякі документи / приклади додасть набагато більшої довіри.
Мартін

У моїй другій пропозиції, якщо зараз () буде використовуватися як позначка часу при будь-якому оновленні, таке посилання може допомогти; alvinalexander.com/mysql/… У моїй першій пропозиції кожен стовпець таблиці mysql є незалежним. Отже, введення даних (як використання однієї змінної у питанні вище) здійснюється самостійно. Однак ви можете порівнювати та контрастувати дані в різних стовпцях, використовуючи оператори типу>, <, =,! = ,! <. Це просто означає, що ви не можете вводити дані в стовпці, як це; mysql> набір таблиць оновлення last_update = last_monitor = now () де id = 1;
Вахінья Брайан,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.