MySQL使用DATETIME设DEFAULT/ON UPDATE记录分钟级时间的语法问题
你的建表语句存在两处核心语法错误:
- DATETIME类型后括号内不支持传入格式字符串。
DATETIME(fsp)语法中仅接受0-6的整数作为参数,代表秒的小数部分精度(例如DATETIME(3)表示精确到毫秒),不需要也不能在类型定义阶段指定YYYY-MM-DD hh:mm这类格式,DATETIME的原生存储格式固定为YYYY-MM-DD hh:mm:ss。 DEFAULT和ON UPDATE子句后不能留空。要实现插入时自动填充当前时间、更新行时自动同步时间的效果,两个关键字后必须明确指定对应的取值,直接空写会直接触发语法报错。
根据你的精度要求,有两种可落地的实现方案:
方案1:兼容低版本MySQL(5.6及以上全版本支持)
如果不需要强制存储层面清零秒位,仅业务使用时不需要秒级数据,直接使用内置的自动时间戳配置即可,是最稳定通用的写法:
CREATE TABLE forum( postID INT AUTO_INCREMENT, PRIMARY KEY (postID), title VARCHAR(100), content VARCHAR(2000), postTime DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );
业务查询时如果需要输出精确到分钟的时间,用DATE_FORMAT(postTime, '%Y-%m-%d %H:%i')即可拿到格式化后的分钟级时间,也可以用DATE_SUB(postTime, INTERVAL SECOND(postTime) SECOND)直接将时间截断到分钟。
注:
INT(2)里的数字2只是显示宽度,不限制整数的存储范围,作为自增主键如果后续数据量可能超过99,直接写INT即可,不需要额外指定长度。
方案2:存储层面强制分钟级精度(需MySQL 8.0.13及以上版本支持)
如果要求数据库中存储的时间本身就不带秒信息(秒位固定为00),可以利用MySQL 8.0之后支持的默认值表达式特性,建表时直接配置自动截断:
CREATE TABLE forum( postID INT AUTO_INCREMENT, PRIMARY KEY (postID), title VARCHAR(100), content VARCHAR(2000), postTime DATETIME DEFAULT (DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:00')) ON UPDATE (DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:00')) );
注意表达式必须用括号包裹,否则会被识别为语法错误。配置完成后,插入、更新记录时postTime字段会自动将当前时间截断到分钟,不需要业务代码做额外处理。
内容的提问来源于stack exchange,提问作者DennisM
相关产品推荐
相关产品推荐

