我需要更新2个datetime列,并且需要使用mysql 4.1.20版本使其完全相同。我正在使用此查询:
mysql> update table set last_update=now(), last_monitor=now() where id=1;
这是安全的,或者由于对now()
?的2次可见调用,所以这些列有可能在不同的时间更新。
我不认为可以使用不同的值进行更新(我认为内部mysqlnow()
每行或类似的调用仅一次),但是我不是专家,您怎么看?
Answers:
找到了解决方案:
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对每个语句评估一次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)
你可以在一个变量现在存储的值()运行更新查询之前,然后使用该变量同时更新的领域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()
每个查询只询问一次。
有两种方法可以实现:
首先,我建议您将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删除该行的属性作为时间戳。每次插入一行或更新时间也都会更新。