我有一个表格,其中包含几个日期(以及其他内容),如下所示:
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个) UPDATE
,INSERT INTO
到DEFAULT
定义中的{3}。{/ p>
我的问题是:分配值CURRENT_TIMESTAMP
的所有列是否会在多次使用时始终收到完全相同的值?或者每列确定CURRENT_TIMESTAMP
一旦执行后的值,因此可能在一秒之后(如果我们距离下一秒几毫秒,则很容易发生。)
到目前为止,我还没有看到任何问题,但这并不意味着它不可能发生。这个特定的案例是否在MySQL参考中的某处正确记录了?
答案 0 :(得分:2)
NOW()返回一个常量时间,指示语句开始执行的时间。 (在存储的函数或触发器中,NOW()返回函数或触发语句开始执行的时间。)这与SYSDATE()的行为不同,后者返回执行它的确切时间。
所以即使查询运行了几个小时,current_timestamp
(即synonym for now()
)也会具有相同的值。如果查询得到replicated到另一台服务器,它实际上甚至会保留该值。