Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql使用相同的now()更新多个列_Mysql_Sql Update - Fatal编程技术网

mysql使用相同的now()更新多个列

mysql使用相同的now()更新多个列,mysql,sql-update,Mysql,Sql Update,我需要使用mysql版本4.1.20更新2个datetime列,并且需要它们完全相同。我正在使用此查询: mysql> update table set last_update=now(), last_monitor=now() where id=1; 由于对now()? 我不认为它可以用不同的值进行更新(我认为mysql内部每行只调用一次now()或类似的东西),但我不是专家,你怎么看 更新: 第二个问题被提取。如果您确实需要确保now()具有相同的值,您可以运行两个查询(这也将回答您

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

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

我不认为它可以用不同的值进行更新(我认为mysql内部每行只调用一次
now()
或类似的东西),但我不是专家,你怎么看

更新:
第二个问题被提取。

如果您确实需要确保
now()
具有相同的值,您可以运行两个查询(这也将回答您的第二个问题,在这种情况下,您要求
update last\u monitor=to last\u update
last\u 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()的值存储在变量中,然后使用该变量更新字段
last\u update
last\u monitor

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

找到了解决方案:

mysql> UPDATE table SET last_update=now(), last_monitor=last_update WHERE id=1;
我在MySQL文档中发现,经过几次测试后,它可以正常工作:

下面的语句将col2设置为当前(更新的)col1值,而不是原始col1值。结果是col1和col2 具有相同的值。此行为不同于标准SQL

更新t1集合col1=col1+1,col2=col1


您可以将以下代码放在时间戳列的默认值上:
CURRENT\u TIMESTAMP ON UPDATE CURRENT\u TIMESTAMP
,因此在UPDATE上,这两列取相同的值。

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

当您使用
now()
函数时,每次在另一个查询中调用当前时间戳时,系统都会调用它。

MySQL在语句开始执行时对每个语句立即求值一次()。因此,每个语句可以有多个visible 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)

有两种方法可以做到这一点

首先,我建议您在将now()声明为变量后再将其注入sql语句。让我们说

var x = now();
mysql> UPDATE table SET last_update=$x, last_monitor=$x WHERE id=1;
从逻辑上讲,如果您希望最后一个监视器有不同的输入,那么您将添加另一个变量,如

var y = time();
mysql> UPDATE table SET last_update=$x, last_monitor=$y WHERE id=1;
通过这种方式,您可以尽可能多地使用变量,不仅在mysql语句中,而且在项目中使用的服务器端脚本语言(如PHP)中。 请记住,这些变量可以作为输入插入到应用程序前端的表单中。这使得项目是动态的,而不是静态的


其次如果now()表示更新时间,那么使用mysql可以将行的属性标记为时间戳。每次插入一行或更新时间也会更新。

AFAIK“更新时”对每个表有一列的限制,因此无法将其同时设置为两列。这两个更新如何?您是否也猜到mysql足够聪明,可以将它们组合成一个语句?因为它不会。我建议你从这里删除第二个问题,并最终在另一个帖子中重新发布。欢迎来到SO。虽然这是问题的一个解决方案,但它并没有真正回答“使用mysql内置的NOW()函数有问题吗?”。此外,您还建议使用海报可能无法控制的外部语言。我不确定你的第二个建议(我对mysql的记忆没有那么详细),但通过指向一些文档/示例的链接来支持它会更加可信;在我的第一个建议中,mysql表中的每一列都是独立的。因此,数据输入(如在上述问题中使用一个变量)是独立完成的。但是,您可以使用诸如>,之类的运算符来比较和对比不同列中的数据,是否有任何方法不起作用?在过程中还是使用与临时表的联接?