ERROR 1067 (42000): Invalid default value for '***'

标题中的***代表创建表时的一个属性,当使用TIMESTAMP来定义属性时报的错;

解决方案:在TIMESTAMP后面跟上一个系统默认时间戳:

eg:

CREATE TABLE test(
id INT(10) KEY AUTO_INCREMENT,
time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);


在 MySQL 中,错误 `ERROR 1067 (42000): Invalid default value for 'column_name'` 通常发生在你尝试为某个列设置一个不合法的默认值时。MySQL 对某些数据类型(如 `DATE`, `DATETIME`, `TIMESTAMP`)的默认值有严格限制。 --- ### 常见原因及解决方案 #### ✅ 示例场景: ```sql CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, created_at DATETIME DEFAULT '0000-00-00 00:00:00' ); ``` **报错:** ``` ERROR 1067 (42000): Invalid default value for 'created_at' ``` --- ### 🔍 原因分析: #### 1. **MySQLSQL 模式(sql_mode)中包含 `NO_ZERO_DATE` 或 `STRICT_ALL_TABLES`** - 如果启用了 `NO_ZERO_DATE`,那么 `'0000-00-00 00:00:00'` 被视为非法日期。 - 如果启用了 `STRICT_ALL_TABLES`,插入无效值将直接报错而不是警告。 #### 2. **使用了非法的默认值** - 例如对 `DATETIME` 使用了非时间格式字符串、数字或非法日期格式。 --- ### ✅ 解决方法 #### 方法一:更改默认值为合法值(推荐) ```sql CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); ``` ✅ `CURRENT_TIMESTAMP` 是合法且常用的方式。 --- #### 方法二:允许零日期(不推荐生产环境) 如果你确实需要使用 `'0000-00-00 00:00:00'`,可以修改 MySQL 的配置文件(如 `my.cnf` 或 `my.ini`),去掉 `NO_ZERO_DATE` 模式: ```ini [mysqld] sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION ``` 然后重启 MySQL 服务使配置生效。 或者临时修改会话模式: ```sql SET sql_mode = 'STRICT_TRANS_TABLES'; ``` ⚠️ 注意:这种方式可能会影响其他查询行为,不建议用于生产环境。 --- #### 方法三:使用 `NULL` 并设置字段为可空 ```sql CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, created_at DATETIME NULL DEFAULT NULL ); ``` 这样避免了非法默认值问题。 --- ### 💡 补充说明 - `CURRENT_TIMESTAMP` 可以作为 `DATETIME` 和 `TIMESTAMP` 类型的默认值。 - `TIMESTAMP` 自动受时区影响,而 `DATETIME` 不受影响。 - 推荐优先使用 `CURRENT_TIMESTAMP` 或允许 `NULL` 来替代零日期。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值