【问题标题】:When running UPDATE ... datetime = NOW(); will all rows updated have the same date/time?当运行 UPDATE ... datetime = NOW();所有更新的行都会有相同的日期/时间吗?
【发布时间】:2008-10-12 07:08:15
【问题描述】:

当你运行类似的东西时:

UPDATE table SET datetime = NOW();

在具有 1 000 000 000 条记录且查询需要 10 秒才能运行的表上,所有行的时间是否完全相同(分钟和秒)还是不同的时间?换句话说,是查询开始的时间还是每行更新的时间?

我正在运行 MySQL,但我认为这适用于所有数据库。

【问题讨论】:

  • 如果最终结果对您很重要 - 首先测试它,仅仅因为它“应该”按文档说明工作,并不意味着它会。如有疑问,请测试!
  • 是的,测试很重要 (+1),但不应该是做出决定的唯一依据。如果测试的行为实际上没有记录在案,它可能会在未来的任何时间发生变化。我们应该只依赖记录在案的行为,但要对其进行测试以确保它按记录工作。

标签: mysql sql datetime sql-update


【解决方案1】:

http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_now

"NOW() 返回一个常数时间,指示语句开始执行的时间。(在存储的例程或触发器中,NOW() 返回例程或触发语句开始执行的时间。)这与 SYSDATE() 的行为不同,它返回从 MySQL 5.0.13 开始执行的确切时间。"

【讨论】:

  • SQL 是面向 SET 的,这意味着更新适用于整个集合或根本不适用。 NOW() 和 SYSDATE() 之间的区别在这里无关紧要。在这两种情况下,“日期时间”字段都将使用单个/不同的值进行更新。
【解决方案2】:

NOW() 分配给一个变量,然后用变量更新日期时间:

update_date_time=now()

现在这样更新

UPDATE table SET datetime =update_date_time;

根据您的要求更正语法

【讨论】:

    【解决方案3】:

    它们应该有相同的时间,更新应该是原子的,这意味着无论执行多长时间,操作都应该发生,就好像所有事情都在同一时间完成一样。

    如果您遇到不同的行为,是时候更换另一个 DBMS。

    【讨论】:

    • 没有遇到任何事情,只是在我继续之前确认并假设它会发生。
    【解决方案4】:

    sqlite 的答案是

    update TABLE set mydatetime = datetime('now');
    

    以防其他人正在寻找它。

    【讨论】:

      猜你喜欢
      • 2019-06-17
      • 2020-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多