首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL "Field doesn't have a default value" 錯誤根因與三種解決方案

     編輯:MySQL 綜合教學

錯誤現場還原

博客聯盟系統突然無法提交文章,報錯:Field 'web_pic' doesn't have a default value。排查發現該欄位定義為 NOT NULL 卻無預設值,導致 INSERT 未顯式賦值時失敗。根因為近期頻繁匯入導出導致建表語句異常。

方案一:修正表結構(推薦,治本)

為欄位提供預設值或允許 NULL:

-- 方案 A:設定預設值
ALTER TABLE table_name MODIFY COLUMN web_pic VARCHAR(255) NOT NULL DEFAULT '';

-- 方案 B:允許 NULL(若業務允許)
ALTER TABLE table_name MODIFY COLUMN web_pic VARCHAR(255) NULL DEFAULT NULL;

-- 方案 C:設為自增主鍵(若為 ID 類欄位)
ALTER TABLE table_name MODIFY COLUMN id INT NOT NULL AUTO_INCREMENT PRIMARY KEY;

操作前務必備份,生產環境建議低峰期執行。

方案二:調整 SQL_MODE 寬鬆模式(治標,快速恢復)

MySQL 5.7+ 預設啟用 STRICT_TRANS_TABLES 嚴格模式,導致隱式預設值失效。修改配置文件 my.cnf/my.ini:

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

Windows 圖形介面:MySQL Instance Config Wizard → 取消勾選 Enable Strict Mode。重啟 MySQL 生效。

方案三:應用層確保欄位賦值(規範開發)

  • INSERT 語句顯式列出所有 NOT NULL 欄位並賦值
  • ORM 框架配置 @Column(nullable=false) 實體類非空字段初始化
  • 資料庫遷移腳本中為新增非空欄位設定 DEFAULT 值

深度解析:為什麼「之前正常」突然失效?

MySQL 版本升級(5.6→5.7/8.0)預設 sql_mode 變更;或 mysqldump 導出時未包含 DEFAULT 子句,導入新實例後行為改變。建議鎖定 sql_mode 版本一致性,避免跨環境差異。

生產環境最佳實踐

  1. 建表階段為所有 NOT NULL 欄位顯式定義 DEFAULT
  2. 統一管理 sql_mode,推薦:ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
  3. CI/CD 流程加入 SHOW CREATE TABLE 結構對比檢查
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved