Mysql Field * doesn't have a default value解決方案

來源:互聯網
上載者:User

標籤:出現   user   conf   相同   字元   安全   select   post   change   

MySQL 5中,出現錯誤提示: 

Field ‘id‘ doesn‘t have a default value 

  www.2cto.com  

解決方案一: 

 

開啟my.ini,尋找 

sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 

 

修改為 

 

sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 

 

然後重啟MYSQL 

 

解決方案二: 

MySQL 5 uses a strict mode which needs to be disabled. 

In Windows, Goto Start-->Programs-->MySQL->MySQL Instance Config Wizard. Follow through the Reconfigure Instance option-->Detailed Configuration-->Continue Next a few screens. At the bottom under Enable TCP/IP option there is ‘Enable Strict Mode‘. Deslect this option (no tick). Save changes and MySQL will restart 

 

  原來在MySQL 5.0.2之前,MySQL對非法或不當值並不嚴厲,而且為了資料輸入還會強制將它們變為合法值。在MySQL 5.0.2和更高版本中,保留了以前的預設行為,但你可以為不良值選擇更傳統的處理方法,從而使得伺服器能夠拒絕並放棄出現不良值的語句。本節介紹了MySQL的預設行為(寬大行為),新的嚴格的SQL模式,以及它們的區別。 

  如果你未使用strict 模式,下述情況是真實的。如果將“不正確”的值插入到列,如將NULL值插入非NULL列,或將過大的數值插入數值列,MySQL會將這些列設定為“最可能的值”,而不是建置錯誤資訊。 

  · 如果試圖將超範圍的值儲存到數值列,MySQL伺服器將儲存0(最小的可能值)取而代之,或最大的可能值。 

  · 對於字串,MySQL或儲存Null 字元串,或將字串儘可能多的部分儲存到列中。 

  · 如果打算將不是以數值開頭的字串儲存到數值列,MySQL將儲存0。 

  · MySQL允許將特定的不正確日期值儲存到DATE和DATETIME列(如“2000-02-31”或“2000-02-00”)。其觀點在於,驗證日期不是SQL伺服器的任務。如果MySQL能儲存日期值並準確檢索相同的值,MySQL就能按給定的值儲存它。如果日期完全不正確(超出伺服器能儲存的範圍)將在列中儲存特殊的日期值“0000-00-00”取而代之。 

  · 如果試圖將NULL值儲存到不接受NULL值的列,對於單行INSERT語句,將出現錯誤。對於多行INSERT語句或INSERT INTO ... SELECT語句,MySQL伺服器會儲存針對列資料類型的隱含預設值。一般情況下,對於數實值型別,它是0,對於字串類型,它是Null 字元串(‘‘),對於日期和時間類型是“zero”。 

  · 如果INSERT語句未為列指定值,如果列定義包含明確的DEFAULT子句,MySQL將插入預設值。如果在定義中沒有這類DEFAULT子句,MySQL會插入列資料類型的隱含預設值。 

  採用前述規則的原因在於,在語句開始執行前,無法檢查這些狀況。如果在更新了數行後遇到這類問題,我們不能僅靠復原解決,這是因為儲存引擎可能不支援復原。中止語句並不是良好的選擇,在該情況下,更新完成了“一半”,這或許是最差的情況。對於本例,較好的方法是“僅可能做到最好”,然後就像什麼都未發生那樣繼續。 

  在MySQL 5.0.2和更高版本中,可以使用STRICT_TRANS_TABLES或STRICT_ALL_TABLES SQL模式,選擇更嚴格的處理方式。 

  STRICT_TRANS_TABLES的工作方式: 

  · 對於事務性儲存引擎,在語句中任何地方出現的不良資料值均會導致放棄語句並執行復原。 

  · 對於非事務性儲存引擎,如果錯誤出現在要插入或更新的第1行,將放棄語句。(在這種情況下,可以認為語句未改變表,就像事務表一樣)。首行後出現的錯誤不會導致放棄語句。取而代之的是,將調整不良資料值,並給出警示,而不是錯誤。換句話講,使用STRICT_TRANS_TABLES後,錯誤值會導致MySQL執行復原操作,如果可以,所有更新到此為止。

 

  要想執行更嚴格的檢查,請啟用STRICT_ALL_TABLES。除了非事務性儲存引擎,它與STRICT_TRANS_TABLES等同,即使當不良資料出現在首行後的其他行,所產生的錯誤也會導致放棄語句。這意味著,如果錯誤出現在非事務性表多行插入或更新過程的中途,僅更新部分結果。前面的行將完成插入或更新,但錯誤出現點後面的行則不然。對於非事務性表,為了避免這種情況的發生,可使用單行語句,或者在能接受轉換警告而不是錯誤的情況下使用STRICT_TRANS_TABLES。要想在第1場合防止問題的出現,不要使用MySQL來檢查列的內容。最安全的方式(通常也較快)是,讓應用程式負責,僅將有效值傳遞給資料庫。 

  有了嚴格的模式選項後,可使用INSERT IGNORE或UPDATE IGNORE而不是不帶IGNORE的INSERT或UPDATE,將錯誤當作警示對待。 

Mysql Field * doesn't have a default value解決方案

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.