博客聯盟系統突然無法提交文章,報錯: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;
操作前務必備份,生產環境建議低峰期執行。
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 生效。
NOT NULL 欄位並賦值@Column(nullable=false) 實體類非空字段初始化DEFAULT 值MySQL 版本升級(5.6→5.7/8.0)預設 sql_mode 變更;或 mysqldump 導出時未包含 DEFAULT 子句,導入新實例後行為改變。建議鎖定 sql_mode 版本一致性,避免跨環境差異。
NOT NULL 欄位顯式定義 DEFAULTsql_mode,推薦:ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTIONSHOW CREATE TABLE 結構對比檢查