我需要更新2个日期时间列,并且我需要它们使用mysql 4.1.20版完全相同。我正在使用此查询:
mysql> update table set last_update=now(), last_monitor=now() where id=1;
这是安全的,或者由于对now()
的2次可见调用,列可能会在不同时间更新?
我不认为它可以用不同的值更新(我认为内部mysql调用now()
每行一次或类似的东西),但我不是专家,您怎么看?
更新 第二个问题被提取here。
答案 0 :(得分:128)
找到解决方案:
mysql> UPDATE table SET last_update=now(), last_monitor=last_update WHERE id=1;
我在MySQL Docs中找到了this,经过一些测试后它可以运行:
以下语句将col2设置为当前(更新的)col1值,而不是原始col1值。结果是col1和col2 具有相同的价值。此行为与标准SQL不同。
UPDATE t1 SET col1 = col1 + 1,col2 = col1;
答案 1 :(得分:7)
Mysql不是很聪明。如果要在多个更新或插入查询中使用相同的时间戳,则需要声明变量。
当您使用now()
功能时,每次在另一个查询中调用时,系统都会调用当前时间戳。
答案 2 :(得分:1)
您可以在运行更新查询之前将now()的值存储在变量中,然后使用该变量更新字段last_update
和last_monitor
。
这将确保now()仅执行一次,并且在您需要的两列上更新相同的值。
答案 3 :(得分:1)
您可以将以下代码放在timestamp列的默认值上:
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
,所以在更新时,两列的值相同。
答案 4 :(得分:1)
当语句开始执行时,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)
答案 5 :(得分:0)
如果您确实需要确保now()
具有相同的值,则可以运行两个查询(这也将回答您的第二个问题,在这种情况下,您要求update last_monitor = to last_update
但{{{} 1}}尚未更新)
last_update
无论如何,我认为mysql足够聪明,每次查询只需要mysql> update table set last_update=now() where id=1;
mysql> update table set last_monitor = last_update where id=1;
一次。
答案 6 :(得分: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)中,尽可能多地使用变量。 请记住,可以将这些相同的变量作为输入插入到应用程序前端的表单中。这使项目变得动态而不是静态。
其次 ,如果now()指示更新时间,则可以使用mysql删除该行的属性作为时间戳。每次插入一行或更新时间也都会更新。