錯誤 Field 'web_pic' doesn't have a default value 表示:該欄位定義為 NOT NULL 且無 DEFAULT 值,且 INSERT 語句未顯式提供值。嚴格 SQL 模式下直接報錯;寬鬆模式下會塞入「零值」(0、空串、'0000-00-00')。本文提供三種修復路徑,適用不同環境約束。
CREATE TABLE blog (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(100) NOT NULL,
web_pic VARCHAR(200) NOT NULL -- 無 DEFAULT,隱含 NOT NULL
) ENGINE=InnoDB;
INSERT INTO blog (title) VALUES ('Test'); -- 報錯:Field 'web_pic' doesn't have a default value
適用場景:舊應用無法修改代碼、測試環境、臨時繞過
-- 檢查當前模式
SELECT @@sql_mode;
-- 典型輸出:STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
-- 會話級臨時關閉(斷連失效)
SET SESSION sql_mode = 'NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
-- 全局持久化(修改 my.cnf/my.ini)
[mysqld]
sql_mode = "NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
# 重啟生效
⚠️ 風險:關閉嚴格模式會允許「零值」寫入,掩蓋應用層 Bug,導致資料品質下降。生產環境慎用。
Windows 安裝包自帶配置精靈:
本質同方案一,圖形化操作適合不習慣編輯配置檔的用戶。
核心原則:欄位定義要業務語義一致
ALTER TABLE blog MODIFY web_pic VARCHAR(200) NOT NULL DEFAULT '';
適用:業務允許「無圖片」狀態,空串語義明確。
ALTER TABLE blog MODIFY web_pic VARCHAR(200) NULL DEFAULT NULL;
適用:圖片可選,NULL 表「未上傳」區別於空串「上傳了空值」。
若報錯欄位是主鍵且非 AUTO_INCREMENT:
-- 錯誤定義
CREATE TABLE t (id INT PRIMARY KEY); -- 手動插入 id
-- 正確定義
CREATE TABLE t (id INT PRIMARY KEY AUTO_INCREMENT);
my.cnf / 重啟服務 → 方案一、二不可用ALTER TABLE 或重建表)NOT NULL DEFAULT '' / NULL DEFAULT NULLSHOW CREATE TABLE 對比基準 Schema「Field doesn't have a default value」是Schema 定義與應用寫入不匹配的信號。雲端環境下修正表結構(加 DEFAULT 或允許 NULL)是唯一正解;自建環境可暫時調整 SQL Mode 過渡,但必須最終回歸 Schema 修正。良好的建表規範能從源頭消滅此類問題。