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_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足够聪明,可以将它们组合成一个语句?因为它不会。【参考方案2】:

您可以在运行更新查询之前将 now() 的值存储在变量中,然后使用该变量更新字段 last_updatelast_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 上的当前时间戳?

PHP:具有不同名称的多个按钮以使用 AJAX 更新 MySQL 数据库

MySQL更新列的序列号按具有相同值的字段分组

更新与其他列具有一个或多个相同值的列值

MYSQL 存储过程 - 如果满足某些条件,则更新多个列