/* SQL错误(1067):Invalid default value for 'AddressId' */

本文介绍使用HeidiSQL设置主键过程中遇到的错误及解决办法。主要针对/*SQL错误(1067):Invalid default value for ‘AddressId’*/,通过调整默认值设置,确保主键正确创建。

使用Heidi SQL设置主键时出现/* SQL错误(1067):Invalid default value for ‘AddressId’ */

主键设置操作为:
在要设置主键的行右键,点击【创建新索引】→【PRIMARY】
需要将默认处设置为【无默认值】
在这里插入图片描述
以下为代码:

CREATE TABLE `address` (
	`AddressId` INT(11) NOT NULL,
	`PersonId` INT(11) NULL DEFAULT NULL,
	`City` VARCHAR(50) NULL DEFAULT NULL,
	`Sate` VARCHAR(50) NULL DEFAULT NULL,
	PRIMARY KEY (`AddressId`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
错误信息: ``` SQL 错误 [1067] [42000]: Invalid default value for 'id' ``` 这是 **MySQL** 数据库中非常常见的错误,特别是在执行 `CREATE TABLE` 或 `ALTER TABLE` 语句时。我们来详细分析这个错误的原因、常见场景,并提供完整的解决方案。 --- ## 🔍 错误含义 - **错误代码**:`1067`(ER_INVALID_DEFAULT) - **SQLSTATE**:`42000`(语法或访问规则错误) - **含义**:你为字段 `'id'` 指定了一个 **MySQL 认为不合法的默认值(DEFAULT)** 这通常发生在以下几种情况: --- ## ✅ 常见原因与解决方案 ### 🟡 场景 1:`id` 是 `AUTO_INCREMENT` 主键,但设置了 `DEFAULT` 值 ```sql -- ❌ 错误示例 CREATE TABLE goods ( id INT AUTO_INCREMENT DEFAULT 1, name VARCHAR(100), PRIMARY KEY (id) ); ``` > ⛔ 报错:`Invalid default value for 'id'` ### ✅ 原因: - `AUTO_INCREMENT` 字段不能有显式的 `DEFAULT` 值。 - MySQL 认为这是冲突的:自增由系统控制,不能再手动指定默认值。 ### ✅ 正确写法: ```sql CREATE TABLE goods ( id INT AUTO_INCREMENT, name VARCHAR(100), PRIMARY KEY (id) ); ``` 或者如果你真的不需要自增,只想设默认值: ```sql CREATE TABLE goods ( id INT DEFAULT 0, name VARCHAR(100) ); ``` --- ### 🟡 场景 2:`id` 是时间类型(如 `DATETIME`),默认值是 `'0000-00-00'` ```sql -- ❌ 错误示例 CREATE TABLE goods ( id DATETIME DEFAULT '0000-00-00 00:00:00', name VARCHAR(100) ); ``` > ⛔ 报错:`Invalid default value for 'id'` ### ✅ 原因: - 当前 MySQL 的 `sql_mode` 包含 `NO_ZERO_DATE` 或 `STRICT_TRANS_TABLES`(默认开启) - 不允许使用 `'0000-00-00'` 这类“零日期”作为默认值 ### ✅ 查看当前模式: ```sql SELECT @@sql_mode; ``` 输出可能包含: ``` ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ... ``` 其中 `NO_ZERO_DATE` 禁止了 `'0000-00-00'` 作为默认值。 --- ### ✅ 解决方案 #### ✅ 方案 A:使用合法的默认时间(推荐) ```sql CREATE TABLE goods ( id DATETIME DEFAULT CURRENT_TIMESTAMP, name VARCHAR(100) ); ``` 或指定一个具体有效时间: ```sql CREATE TABLE goods ( id DATETIME DEFAULT '2024-01-01 00:00:00', name VARCHAR(100) ); ``` #### ✅ 方案 B:修改 sql_mode(仅测试环境可用,生产慎用) 编辑 MySQL 配置文件(如 `my.cnf` 或 `my.ini`): ```ini [mysqld] sql_mode = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,ALLOW_INVALID_DATES" ``` 重启 MySQL 后即可使用 `'0000-00-00'` 默认值。 > ⚠️ 警告:此设置可能导致数据不一致,不推荐在生产环境中使用。 --- ### 🟡 场景 3:`id` 是整数类型,但默认值是非法字符串 ```sql -- ❌ 错误 id INT DEFAULT 'abc' ``` > `'abc'` 无法转换为整数 → 默认值无效 ### ✅ 正确做法: ```sql id INT DEFAULT 0 ``` --- ### 🟡 场景 4:字段不允许为 NULL 且没有默认值(间接导致问题) ```sql CREATE TABLE goods ( id INT NOT NULL -- 没有 AUTO_INCREMENT,也没有 DEFAULT ); ``` 虽然不会直接报 “invalid default”,但在某些 SQL 模式下插入数据时会失败。 ### ✅ 正确做法: 要么允许自增,要么给默认值: ```sql id INT NOT NULL AUTO_INCREMENT -- 或 id INT NOT NULL DEFAULT 0 ``` --- ## ✅ 推荐的标准建表语句(最佳实践) ```sql CREATE TABLE goods ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, num INT NOT NULL DEFAULT 0, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` ✅ 安全、兼容、清晰。 --- ## 🛠️ 如何修复已有表? 如果表已存在并出错,可以用 `ALTER TABLE` 修改字段: ```sql -- 移除 AUTO_INCREMENT 的 DEFAULT(如果有) ALTER TABLE goods MODIFY COLUMN id INT AUTO_INCREMENT; -- 或者移除 DEFAULT(保留非自增) ALTER TABLE goods MODIFY COLUMN id INT DEFAULT 0; ``` > 注意:修改字段结构前请备份数据! --- ## 总结 | 原因 | 是否允许 | 建议 | |------|--------|------| | `AUTO_INCREMENT` + `DEFAULT` | ❌ 不允许 | 移除 `DEFAULT` | | `DATETIME DEFAULT '0000-00-00'` | ❌ 在 `NO_ZERO_DATE` 下不允许 | 改为 `CURRENT_TIMESTAMP` 或调整 `sql_mode` | | `INT DEFAULT 'abc'` | ❌ 类型不匹配 | 使用数值默认值 | | 非空字段无默认值 | ⚠️ 可能导致插入失败 | 显式添加 `DEFAULT` | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值