CURRENT_TIMESTAMP可以在INSERT或UPDATE命令中更改吗?

时间:2017-08-31 18:01:56

标签: mysql datetime

我有一个表格,其中包含几个日期(以及其他内容),如下所示:

CREATE TABLE message (
    created_on DATEIMTE NOT NULL DEFAULT CURRENT_TIMESTAMP,
    send_on DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    modified_on DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    status CHAR NOT NULL DEFAULT 'V',
    status_date DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    ...
);

当我执行INSERT INTO时,我通常不会定义modified_on字段,因为默认值是有意义的。如果我不想立即发送消息,我可以更改send_on值。

所以插入可能如下所示:

INSERT INTO message
    (send_on)
    VALUES ('2017-08-31 14:31:22');

稍后,用户可能会要求更改send_on字段。此时,我运行UPDATE语句如下:

UPDATE message
    SET send_on = <user-defined-date>,
        modified_on = CURRENT_TIMESTAMP
    WHERE id = 123;

这种情况很好,因为我只修改了一个日期。

现在,在用户进行修改时,我可能还需要更改status字段。这将转化为这样的事情:

UPDATE message
    SET send_on = <user-defined-date>,
        modified_on = CURRENT_TIMESTAMP,
        status = <new-status>,
        status_date = CURRENT_TIMESTAMP
    WHERE id = 123;

在上一个UPDATE语句中并且不太明显,在上面的INSERT INTO语句中,我将多个DATETIME字段设置为值CURRENT_TIMESTAMP(其中2个) UPDATEINSERT INTODEFAULT定义中的{3}。{/ p>

我的问题是:分配值CURRENT_TIMESTAMP的所有列是否会在多次使用时始终收到完全相同的值?或者每列确定CURRENT_TIMESTAMP一旦执行后的值,因此可能在一秒之后(如果我们距离下一秒几毫秒,则很容易发生。)

到目前为止,我还没有看到任何问题,但这并不意味着它不可能发生。这个特定的案例是否在MySQL参考中的某处正确记录了?

1 个答案:

答案 0 :(得分:2)

根据documentation

  

NOW()返回一个常量时间,指示语句开始执行的时间。 (在存储的函数或触发器中,NOW()返回函数或触发语句开始执行的时间。)这与SYSDATE()的行为不同,后者返回执行它的确切时间。

所以即使查询运行了几个小时,current_timestamp(即synonym for now())也会具有相同的值。如果查询得到replicated到另一台服务器,它实际上甚至会保留该值。