mysql設置text字段為not null,並且沒有默認值,插入報錯:doesn't have a default value


一、問題描述

在往數據庫寫入數據的時候,報錯:

'字段名' 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM