一、問題描述
在往數據庫寫入數據的時候,報錯:
'字段名' doesn't have a default value
本來這個錯誤是經常見到的,無非就是字段沒有設置默認值造成的。奇怪的是,我這邊報錯的字段,其類型是text類型。眾所周知的,text類型是不能有默認值的。如此一來就有了矛盾,text類型的字段明明不能有默認值,那么為什么還會給我報錯,提示缺少默認值呢?
二、問題所在
1、查看字段類型
通過phpmyadmin查看數據表的字段結構,發現text字段在創建的時候,語法為:
//創建字段abstract為text類型,默認為not null
ALTER TABLE `表名` ADD COLUMN `abstract` text not null after `content`;
這個創建語句乍一看沒有問題,但是如果text類型既沒有默認值,也不能為null的話,那么插入的時候,肯定是會出現問題的。
2、解決方案
按照上面的推測邏輯,重新修改字段屬性:
//這里修改abstart字段的類型為text類型,去掉了not null
ALTER TABLE `表名` modify COLUMN `abstract` text;
然后進行測試,發現寫入數據成功。此時查看phpmyadmin的數據表結構,發現此時字段的默認值為null了。果然是not null的問題,問題是,創建數據表的時候,盡量設置字段為not null已經成為共識。。雖然解決了問題,但博主還是不太理解原理是什么。
關於mysql默認值和設置not null的問題,參考博客:
關於mysql設置varchar 字段的默認值”和null的區別,以及varchar和char的區別
三、為什么會報錯
1、第一個原因
通過一頓百度,終於在百度知道上看到這句話:
如果是not null的話,那你就必須插入一個值,你不插入值的話,就會調用默認值。 如果這兩個都沒有的話,就會報錯了。
這個意思就和咱們最開始推測的差不多,字段類型既是 not null,而且還沒默認值,那么在寫入數據的時候肯定是有問題的。就像我們平時看到的,在創建字段並且不設置默認值的時候,mysql都會默認給字段加上默認值null。
2、第二個原因
這個原因就是數據庫的嚴格模式的問題。在mysql 5.7之后,數據庫默認都是采用嚴格模式。
關於嚴格模式的解釋:
mysql給字段設置默認值,以及mysql的嚴格模式
關於嚴格模式這個,我並沒有測試,個人感覺還是建表時候不夠嚴謹造成的問題。關於設置字段默認值和設置not null方面不熟悉造成的。
四、總結
1、如果字段為int 或者varchar類型,那么要設置字段類型為 not null 並且設置default
2、如果字段為text,則既不需要設置not null,也不需要手動設置default 的值
3、關於text字段不能有默認值的問題,這個只針對於手動增加的default屬性,如果創建字段不設置default的話,mysql會默認加上一個默認值Null
end
原文地址:https://blog.csdn.net/LJFPHP/article/details/81939189