mysql用相同的now()更新多个列
Posted
技术标签:
【中文标题】mysql用相同的now()更新多个列【英文标题】:mysql update multiple columns with same now() 【发布时间】:2011-04-17 15:58:33 【问题描述】:我需要更新 2 个日期时间列,并且我需要它们完全相同,使用 mysql 版本 4.1.20。我正在使用这个查询:
mysql> update table set last_update=now(), last_monitor=now() where id=1;
这是安全的,或者由于对now()
的两个可见调用,列有可能以不同的时间更新?
我不认为它可以用不同的值更新(我认为mysql内部每行只调用一次now()
或类似的东西),但我不是专家,你怎么看?
更新: 第二个问题被提取here。
【问题讨论】:
我建议您从这里删除您的第二个问题,并最终在单独的帖子中重新发布。 【参考方案1】:如果您确实需要确保 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足够聪明,可以将它们组合成一个语句?因为它不会。【参考方案2】:您可以在运行更新查询之前将 now() 的值存储在变量中,然后使用该变量更新字段 last_update
和 last_monitor
。
这将确保 now() 只执行一次,并且在您需要的两列上更新相同的值。
【讨论】:
【参考方案3】:找到解决办法:
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;
【讨论】:
有什么方法可以解决这个问题吗?在过程中还是在临时表中使用联接?【参考方案4】:您可以将以下代码放在时间戳列的默认值上:
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
,所以更新两列取相同的值。
【讨论】:
AFAIK“更新时”限制每个表一列,因此不能将其设置为两列。【参考方案5】:Mysql 不是很聪明。当您想在多个更新或插入查询中使用相同的时间戳时,您需要声明一个变量。
当你使用now()
函数时,每次你在另一个查询中调用时,系统都会调用当前时间戳。
【讨论】:
【参考方案6】:当语句开始执行时,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)
【讨论】:
【参考方案7】:有两种方法;
首先,我建议您在将 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 表中的每一列都是独立的。因此数据输入(如在上述问题中使用一个变量)是独立完成的。但是,您可以使用 >、 更新表集 last_update=last_monitor=now() where id=1;以上是关于mysql用相同的now()更新多个列的主要内容,如果未能解决你的问题,请参考以下文章
如何将 MySQL DATETIME 更新为 NOW()? (错误 1064)
如何将 MySql 时间戳列更新为 PHP 上的当前时间戳?