事物有常见的三个时间属性
- 创建时间(ctime)
- 修改时间(mtime)
- 访问时间(atime)
下面考虑使用 mysql 实现。
不要使用 REPLACE
MySQL :: MySQL 5.7 Reference Manual :: 14.2.8 REPLACE Syntax
REPLACE 像 INSERT 一样运作,除了:表中的旧记录与新记录的主键(PRIMARY KEY)或唯一索引(UNIQUE index)一样时,删掉旧记录再插入新记录。
REPLACE works exactly like INSERT, except that if an old row in the table has the same value as a new row for a PRIMARY KEY or a UNIQUE index, the old row is deleted before the new row is inserted.
这就意味着默认值定义为 DEFAULT CURRENT_TIMESTAMP
的字段,在缺失的情况下会重置为当前时间(CURRENT_TIMESTAMP)。
自行实现创建或修改语义
更新(UPDATE)记录,如果 affectedRows
为 0,再尝试插入(INSERT)记录。
由于更新(UPDATE)和插入(INSERT)是两个操作,并发访问的情况下,插入(INSERT)时记录可以已要存在,因此还需要忽略主键冲突错误。
不要使用 ON UPDATE CURRENT_TIMESTAMP
这里的 UPDATE
是指更新语句(UPDATE、INSERT、REPLACE)是否改动了记录内容,新值与旧值不一样表示记录内容变化,会更新字段值为当前时间,否则,不会更新字段值为当前时间。
可在更新语句中设置字段值为 CURRENT_TIMESTAMP
,强制字段值总是更新为当前时间。
另外,更新访问时间(atime)时,会导致使用了 ON UPDATE CURRENT_TIMESTAMP
的字段更新为当前时间。
创建时间(ctime)
字段定义
ctime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
指定默认值为当前时间,在记录创建时自动设置。
字段值更新
INSERT(或 UPDATE) 语句创建(或更新)记录,不指定 ctime
字段。
更新时间(mtime)
字段定义
mtime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
指定默认值为当前时间,在记录创建时自动设置。
字段值更新
INSERT 语句创建记录,不指定 mtime
字段,或指定字段值为 CURRENT_TIMESTAMP。
UPDATE 语句更新记录,指定 mtime
字段值为 CURRENT_TIMESTAMP。
访问时间(atime)
字段定义
atime TIMESTAMP NOT NULL DEFAULT "0000-00-00 00:00:00"
指定默认值为空时间值(表示未访问),在记录创建时自动设置。
字段值更新
UPDATE 语句更新记录,指定 atime
字段值为 CURRENT_TIMESTAMP。