首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL「Field doesn't have a default value」錯誤解決方案:NOT NULL 列缺失默認值與 sql_mode 嚴格模式應對

     編輯:MySQL 資料庫相關知識

插入數據時提示 Field 'web_pic' doesn't have a default value,原因是該列定義為 NOT NULL 但無 DEFAULT,且 MySQL 運行在嚴格 SQL 模式下。本文提供三種解決方案:修改表結構添加默認值、調整 sql_mode 關閉嚴格模式、應用層補全字段值,並分析雲數據庫無法修改配置時的應對策略。

一、錯誤現場

Field doesn't have a default value 錯誤

表結構中 web_pic VARCHAR(255) NOT NULL 缺少 DEFAULT '' 或 DEFAULT 'default.png'。

二、方案 1:修改表結構添加默認值(推薦,治本)

ALTER TABLE `table_name` 
MODIFY COLUMN `web_pic` VARCHAR(255) NOT NULL DEFAULT '';

或指定業務默認值:DEFAULT 'default.png'。
雲數據庫(如京東雲擎、RDS)通常支援在線 DDL,無需停機。

修改列默認值
修改成功

三、方案 2:調整 sql_mode 關閉嚴格模式(治標,不推薦生產)

修改配置文件

[mysqld]
sql_mode = "NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
# 移除 STRICT_TRANS_TABLES, STRICT_ALL_TABLES

或運行時動態調整(會話級)

SET SESSION sql_mode = 'NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

風險:關閉嚴格模式後,NOT NULL 列插入 NULL 會被自動轉為空字符串/0/零日期,掩蓋業務邏輯錯誤,導致數據質量下降。

四、方案 3:應用層保證字段非空(正規軍做法)

  • 實體類/DTO 字段添加 @NotNull / @NotBlank 校驗。
  • Service 層設置默認值:entity.setWebPic(entity.getWebPic() != null ? entity.getWebPic() : "");
  • 數據庫遷移腳本中同步添加 DEFAULT。

五、根因排查:為何突然報錯?

作者推測頻繁導入導出數據庫導致 CREATE TABLE 語句丟失 DEFAULT 子句。建議:

  • 使用 mysqldump --defaults-file=... --no-create-info 僅導數據,結構由版本控制的遷移腳本管理。
  • Flyway / Liquibase 管理 Schema 版本,杜絕手工修改結構差異。

六、總結

首選方案 1:ALTER TABLE ... MODIFY COLUMN ... DEFAULT '',兼容嚴格模式、不改變全局行為、雲數據庫友好。嚴格模式 STRICT_TRANS_TABLES 是數據質量護欄,建議保持開啟,從結構與應用雙層面保證非空列有值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved