编程 在使用 MySQL 5.7 版本时,如果遇到以下错误提示: 深度解析 MySQL “Field 'remarks' doesn't have a default value” 错误及应对方案

2025-01-12 20:41:10 +0800 CST views 597

深度解析 MySQL “Field 'remarks' doesn't have a default value” 错误及应对方案

在使用 MySQL 5.7 版本时,如果遇到以下错误提示:

SQLSTATE[HY000]: General error: 1364 Field 'remarks' doesn't have a default value

通常意味着插入或更新数据时,MySQL 检测到 remarks 字段没有提供相应的值,且该字段未设置默认值。该错误常出现在 MySQL Strict Mode(严格模式)下,或与 sql_mode 的配置相关。

错误背景

  1. 错误信息

    SQLSTATE[HY000]: General error: 1364 Field 'remarks' doesn't have a default value
    

    这是一个 MySQL 5.7 环境下的通用错误码(1364),说明在插入(INSERT)或更新(UPDATE)时某个字段未设置默认值,且该字段被定义为 NOT NULL。

  2. SQL 模式(sql_mode)
    在 MySQL 5.7 中,默认的 sql_mode 包含以下内容:

    • ONLY_FULL_GROUP_BY
    • STRICT_TRANS_TABLES
    • NO_ZERO_IN_DATE
    • NO_ZERO_DATE
    • ERROR_FOR_DIVISION_BY_ZERO
    • NO_ENGINE_SUBSTITUTION

    你给出的场景中,sql_mode 设置为:

    ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
    

    可以看出其中没有显式提及 STRICT_TRANS_TABLESSTRICT_ALL_TABLES,但仍然出现字段无默认值的报错。需要注意,不同环境下 MySQL 的严格模式可能已经被启用或关闭,这取决于具体配置或 MySQL 安装初始的默认 sql_mode。

  3. MySQL 严格模式(Strict Mode)
    严格模式下,如果未为非空字段(NOT NULL)提供数值或设置默认值,将会触发错误而非仅仅发出警告。MySQL 在 5.7 之后默认开启了部分严格模式,以减少数据意外导致的错误。

错误原因

当插入一条新记录时,如果表中存在一个非空(NOT NULL)字段,且该字段没有默认值,那么就必须在插入语句中对该字段赋值,否则 MySQL 在严格模式下会报错。例如,假设有如下建表语句:

CREATE TABLE `test_table` (
  `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  `name` VARCHAR(50) NOT NULL,
  `remarks` VARCHAR(255) NOT NULL
);

这里 remarks 字段被定义为 NOT NULL,但没有设置 DEFAULT,且在插入数据时,如果没有给 remarks 字段提供任何值,就会触发 “Field 'remarks' doesn't have a default value” 错误。

解决思路

1. 在建表时为 remarks 字段添加默认值

如果该字段在业务场景下是允许为空或可有可无的,最直接的方式就是给这个字段添加一个默认值。比如,设置一个空字符串为默认值:

ALTER TABLE `test_table` 
MODIFY COLUMN `remarks` VARCHAR(255) NOT NULL DEFAULT '';

这样,在插入数据时如果没有显式为 remarks 赋值,将自动填充为空字符串 '',从而避免报错。

2. 在插入或更新数据时,显式地为 remarks 字段赋值

如果每次插入或更新都必须要有 remarks 的具体内容,可以保证在 SQL 语句中为其提供值。示例如下:

INSERT INTO `test_table` (`name`, `remarks`)
VALUES ('some name', 'some remarks');

如果你想要存储真正的空值,而不是空字符串,那么需要将字段改成允许 NULL:

ALTER TABLE `test_table`
MODIFY COLUMN `remarks` VARCHAR(255) NULL;

然后在插入语句中可以设置为 NULL

INSERT INTO `test_table` (`name`, `remarks`)
VALUES ('some name', NULL);

3. 调整 sql_mode(谨慎使用)

在某些场景下,为了兼容历史系统或简化部署,也可以通过调整 sql_mode 来避免 MySQL 严格模式的限制,让 MySQL 在插入时对非空字段未提供值仅抛出警告而非报错。但这种做法通常不推荐,因为严格模式有助于避免潜在的数据问题。若确有需要,可在 MySQL 配置文件或会话级别将 STRICT_TRANS_TABLES 或相关严格模式标志移除,示例如下:

SET sql_mode = 'ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

这样做会使得对于缺少默认值的非空字段,MySQL 会用隐式默认值(通常为 ''0)代替并仅抛出警告。这种方法可能会在业务逻辑上留下数据风险,因此要非常谨慎。

总结

“Field 'remarks' doesn't have a default value” 错误本质上是由于在 MySQL 严格模式下,对非空字段没有赋值也没有设置默认值所导致。为解决此问题,可以从以下几个方面入手:

  1. 调整表结构:为字段设置默认值或允许字段为 NULL。
  2. 修改插入逻辑:在插入或更新时显式地对该字段进行赋值。
  3. 修改 sql_mode(非推荐):关闭严格模式,使用更宽松的模式,但要警惕潜在的数据风险。

对于生产环境,最稳定、安全的做法是为字段赋合理的默认值,或者在需要插入数据时始终为非空字段提供值。只有在确实需要保留历史兼容或其他特殊场景下,才考虑更改 sql_mode


希望这篇技术文章能帮助你更好地理解和解决在 MySQL 5.7 中遇到的 “Field 'remarks' doesn't have a default value” 的错误问题,也为你今后在设计数据库字段和插入数据时提供一些思路。

复制全文 生成海报 数据库 SQL 错误处理

推荐文章

一个简单的打字机效果的实现
2024-11-19 04:47:27 +0800 CST
2024年公司官方网站建设费用解析
2024-11-18 20:21:19 +0800 CST
Golang 随机公平库 satmihir/fair
2024-11-19 03:28:37 +0800 CST
在 Nginx 中保存并记录 POST 数据
2024-11-19 06:54:06 +0800 CST
解决python “No module named pip”
2024-11-18 11:49:18 +0800 CST
JavaScript数组 splice
2024-11-18 20:46:19 +0800 CST
Nginx负载均衡详解
2024-11-17 07:43:48 +0800 CST
Redis函数在PHP中的使用方法
2024-11-19 04:42:21 +0800 CST
小技巧vscode去除空格方法
2024-11-17 05:00:30 +0800 CST
PHP 的生成器,用过的都说好!
2024-11-18 04:43:02 +0800 CST
Elasticsearch 条件查询
2024-11-19 06:50:24 +0800 CST
Rust 中的所有权机制
2024-11-18 20:54:50 +0800 CST
Vue3如何执行响应式数据绑定?
2024-11-18 12:31:22 +0800 CST
Vue中的`key`属性有什么作用?
2024-11-17 11:49:45 +0800 CST
如何在Vue中处理动态路由?
2024-11-19 06:09:50 +0800 CST
Vue3 中提供了哪些新的指令
2024-11-19 01:48:20 +0800 CST
使用Vue 3和Axios进行API数据交互
2024-11-18 22:31:21 +0800 CST
html流光登陆页面
2024-11-18 15:36:18 +0800 CST
使用 `nohup` 命令的概述及案例
2024-11-18 08:18:36 +0800 CST
JavaScript 流程控制
2024-11-19 05:14:38 +0800 CST
程序员茄子在线接单