萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 報錯「Field doesn't have a default value」的解決方案與最佳實踐

在使用 phpMyAdmin 建立 MySQL 資料表時,若遇到 Field '*' doesn't have a default value 錯誤,通常是因為嚴格模式(Strict SQL Mode)啟用,且該欄位未定義預設值、也非 NULL 或 AUTO_INCREMENT。

快速修正:調整 SQL Mode(不建議長期使用)

網路上常見的做法是修改 my.ini(Windows)或 my.cnf(Linux),移除 STRICT_TRANS_TABLES:

# 修改前
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

# 修改後
sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

重啟 MySQL 服務即可生效。但這只是「關閉檢查」,掩蓋了資料完整性問題,不建議在生產環境長期使用。

根本解決:建表時明確指定預設值

正確的做法是在 CREATE TABLE 時,為所有非主鍵、非自動遞增的欄位設定合理的 DEFAULT 值:

CREATE TABLE `users` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(50) NOT NULL DEFAULT '',
  `email` VARCHAR(100) NOT NULL DEFAULT '',
  `status` TINYINT NOT NULL DEFAULT 1,
  `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  • 字串類型:DEFAULT ''
  • 數值類型:DEFAULT 0
  • 日期時間:DEFAULT CURRENT_TIMESTAMP 或 DEFAULT '0000-00-00 00:00:00'(視版本而定)
  • 允許為空:改用 NULL 而非 NOT NULL

補充:檢查現有表結構

若表已存在,可用 SHOW CREATE TABLE table_name 查看定義,再用 ALTER TABLE 補上預設值:

ALTER TABLE `users` MODIFY `status` TINYINT NOT NULL DEFAULT 1;

養成「建表即定預設值」的習慣,才能避免嚴格模式下的插入失敗,確保資料一致性。

copyright © 萬盛學電腦網 all rights reserved