You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL创建users表时报错1067(42000):created_at默认值无效

报错原因分析

该报错是MySQL默认值校验不通过的错误(错误码1067),针对你建表语句中created_at DATETIME DEFAULT CURRENT_TIMESTAMP的定义,触发原因主要有两类:

  • 版本兼容限制:MySQL 5.6.5之前的版本,仅支持TIMESTAMP类型的字段使用CURRENT_TIMESTAMP作为默认值,不允许给DATETIME类型直接绑定当前时间作为默认值,会直接触发该报错。
  • SQL严格模式限制:即使是MySQL 5.7及以上版本,如果当前数据库的sql_mode开启了NO_ZERO_DATE、TRADITIONAL这类严格校验规则,未加NOT NULL约束的DATETIME字段默认值定义也可能被校验拦截,触发1067错误。
解决方案

根据你的数据库版本和字段类型需求,可以选择以下适配方案:

  • 方案1(全版本兼容,优先推荐):将created_at的字段类型从DATETIME改为TIMESTAMP
    该写法兼容所有MySQL版本,不会触发默认值校验问题,改完后的建表语句如下:
    CREATE TABLE users (
        id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
        username VARCHAR(50) NOT NULL UNIQUE,
        password VARCHAR(255) NOT NULL,
        created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
    );
    
    注:TIMESTAMP类型的时间范围为1970年至2038年,如果需要存储该范围外的时间,不适用该方案。
  • 方案2(适配MySQL 5.7及以上版本,保留DATETIME类型):给字段补充NOT NULL约束
    如果你需要保留DATETIME类型(支持1000年至9999年的时间范围),只需在字段定义中加上NOT NULL约束,符合严格模式的校验规则即可,修改后的建表语句如下:
    CREATE TABLE users (
        id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
        username VARCHAR(50) NOT NULL UNIQUE,
        password VARCHAR(255) NOT NULL,
        created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
    );
    
    执行前可先通过SELECT @@sql_mode;查看当前SQL模式,即使存在严格校验规则,该写法一般也可直接通过。
  • 方案3(MySQL 5.6.5及更早版本,必须使用DATETIME类型):不指定默认值,插入时手动赋值
    该类版本本身不支持给DATETIME类型绑定当前时间默认值,可先去掉默认值定义建表:
    CREATE TABLE users (
        id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
        username VARCHAR(50) NOT NULL UNIQUE,
        password VARCHAR(255) NOT NULL,
        created_at DATETIME NOT NULL
    );
    
    后续插入数据时手动写入NOW()作为时间值即可,也可通过触发器自动填充,但会增加额外维护成本,非必要不推荐。

内容的提问来源于stack exchange,提问作者SappyCS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.27 05:36:03