mysql用now()更新多个列


87

我需要更新2个datetime列,并且需要使用mysql 4.1.20版本使其完全相同。我正在使用此查询:

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

这是安全的,或者由于对now()?的2次可见调用,所以这些列有可能在不同的时间更新。
我不认为可以使用不同的值进行更新(我认为内部mysqlnow()每行或类似的调用仅一次),但是我不是专家,您怎么看?

更新:在这里 提取第二个问题。


1
我建议您从这里删除第二个问题,并最终将其重新发布在单独的帖子中。
心教堂

Answers:


144

找到了解决方案:

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;


有什么办法行不通吗?在过程中还是在临时表中使用联接?
Soheil Rahsaz

7

MySQL不是很聪明。如果要在多个更新或插入查询中使用相同的时间戳,则需要声明一个变量。

使用该now()功能时,每次在另一个查询中调用该系统时,系统都会调用当前时间戳。


5

语句开始执行时,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

你可以在一个变量现在存储的值()运行更新查询之前,然后使用该变量同时更新的领域last_updatelast_monitor

这将确保now()仅执行一次,并且在所需的两列上更新相同的值。


1

您可以将以下代码放在timestamp列的默认值上: CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,这样在更新时,两列的值相同。


1
AFAIK“更新时”每张表的限制为一列,因此无法将其设置为两列。
Radu Maris 2012年

0

如果您确实需要确保该now()值具有相同的值,则可以运行两个查询(这也会回答您的第二个问题,在这种情况下,您要查询update last_monitor = to last_updatelast_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足够聪明,可以将它们组合为一条语句?因为它不会。
拉斐尔·赫斯科维奇2014年

0

有两种方法可以实现:

首先,我建议您将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删除该行的属性作为时间戳。每次插入一行或更新时间也都会更新。


欢迎来到SO。尽管这是解决问题的方法,但它并不能真正回答“使用mysql内置的NOW()函数是否有问题?”的问题。另外,您建议使用海报可能无法控制的外部语言。我不确定您的第二个建议(我对mysql的回忆并不那么详细),但是通过指向一些文档/示例的链接来支持它会带来更多的可信度。
马丁

在我的第二条建议中,如果每当发生更新时将now()用作时间戳,则以下链接可以为您提供帮助; alvinalexander.com/mysql/… 在我的第一个建议中,mysql表中的每一列都是独立的。因此,数据输入(就像在上面的问题中使用一个变量一样)是独立完成的。但是,您可以使用>,<,=,!= 、! <等运算符来比较和对比不同列中的数据。这只是意味着您不能像这样将数据输入cols。mysql>更新表集last_update = last_monitor = now(),其中id = 1;
Wahinya Brian
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.