在使用 phpMyAdmin 建立 MySQL 資料表時,若遇到 Field '*' doesn't have a default value 錯誤,通常是因為嚴格模式(Strict SQL Mode)啟用,且該欄位未定義預設值、也非 NULL 或 AUTO_INCREMENT。
網路上常見的做法是修改 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 0DEFAULT 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;
養成「建表即定預設值」的習慣,才能避免嚴格模式下的插入失敗,確保資料一致性。