mysql 查数据 default无效_导入mysql数据的时候提示Field * doesn't have a default value解决方法...
項目使用django+mysql
在linux中使用的是mysql5.7,導(dǎo)入數(shù)據(jù)提示:Field * doesn't have a default value
想要解決問題就需要知道在mysql5.7中,啟用了嚴(yán)格模式:
在配置文件中 /etc/mysql/my.cnf 中找到:
sql-model=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
修改為:sql-mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
然后重啟mysql,在重新同步模型到數(shù)據(jù)庫
出現(xiàn)此問題的原因:
在mysql5.0.2以前,mysql對非法值檢查并不嚴(yán)厲,而且為了數(shù)據(jù)輸入還會強制將他們變?yōu)楹戏ㄖ怠?/p>
在5.0.2以后的版本中,保留了以前的默認(rèn)行為,但你可以為不良值選擇更傳統(tǒng)的處理方法,從而使得服務(wù)器能夠拒絕并放棄出現(xiàn)不良值的語句。
mysql 默認(rèn)行為和新的嚴(yán)格sql模式和區(qū)別:
如果未使用嚴(yán)格模式,下面的情況是合法的。如果將不正確的值插入到列,如將null值插入非null列,或?qū)⑦^大的數(shù)據(jù)插入數(shù)值列,mysql 會將這些列設(shè)置為最可能的值,而不是拋出錯誤信息。
如果視圖將超過范圍的值保存到數(shù)值列,mysql服務(wù)器將保存0(最小的可能值)取而代之,或最大的可能值。
對于字符串,mysql 或保存空字符串,或?qū)⒆址赡芏嗟牟糠直4娴搅兄小?/p>
如果打算將不是以數(shù)值開頭的字符串保存到數(shù)值列,mysql將保存0。
mysql允許將特定的不正確日期值保存到DATE和DATETIME列(如:“2000-02-31” 或 “2000-02-00”)。其觀點在于,驗證日期不是sql服務(wù)器你的值。如果mysql能保存日期值并且準(zhǔn)確檢索相同的值,mysql就能按給定的值保存它。如果日期錯誤(超出服務(wù)器能保存的范圍)將在列中保存特殊的日期值“0000-00-00”取而代之。
如果視圖將null值保存到不接受null值的列,對于單行insert語句,將出現(xiàn)錯誤。對于多行insert語句或者insert into...select語句,mysql服務(wù)器會保存針對列數(shù)據(jù)類型的隱含默認(rèn)值。一般情況下,對于數(shù)值類型,它是0,對于字符串類型,它是空字符串(‘’),對于日期和時間類型是“zero”。
如果insert語句未為列指定值,如果列定義包含明確的default子句,mysql將插入默認(rèn)值。如果在定義中沒有這類default子句,mysql 會插入列數(shù)據(jù)類型的隱含默認(rèn)值。
采用前描述規(guī)則的原因在于,在語句開始執(zhí)行前,無法檢查這些情況。如果在更新了舒航后遇到這類問題,我們不能僅靠回滾解決,這是因為存儲引擎可能不支持回滾。種植語句并不是良好的選擇,在該情況下,更新完成了“一半”,這或許是最差的情況。對于本例,較好的方式是“盡可能做到最好”,就像什么都沒有發(fā)生那樣繼續(xù)執(zhí)行。
在mysql 5.0.2以后的版本中,可以使用STRICT_TRANS_TABLES 或 STRICT_ALL_TABLES sql模式,選擇更嚴(yán)格的處理方式。
STRICT_TRANS_TABLES的工作方式:
對于事物性存儲引擎,在語句中任何地方出現(xiàn)的不良數(shù)據(jù)值俊輝導(dǎo)致放棄語句并執(zhí)行回滾。
對于非事物性存儲引擎,如果錯誤出現(xiàn)再要插入或更新的第一行,將放棄語句。(這種情況下,可以認(rèn)為語句未改變表,就像事物表一樣)。首行后出現(xiàn)的錯誤不會導(dǎo)致放棄執(zhí)行語句。取而代之的是,將調(diào)整不良數(shù)據(jù)值,并給出警告,而不是錯誤。換句話講,使用STRICT_TRANS_TABLES后,錯誤值會導(dǎo)致mysql執(zhí)行回滾操作,如果可以,所有更新到此為止。
要想執(zhí)行更嚴(yán)格的檢查,請啟用STRICT_ALL_TABLES。除了非事務(wù)性存儲引擎,它與STRICT_TRANS_TABLES等同,即使當(dāng)不良數(shù)據(jù)出現(xiàn)在首行后的其他行,所產(chǎn)生的錯誤也會導(dǎo)致放棄執(zhí)行語句。這意味著,如果錯誤出現(xiàn)在非事務(wù)性表多行插入或更新過程之中,僅更新部分結(jié)果,前面的行將完成插入或更新,但錯誤出現(xiàn)點后面行為則不然。對于非事務(wù)性表,為了避免這種情況的發(fā)生,可使用單行語句,或者在能接受轉(zhuǎn)換警告而不是錯誤的情況下使用STRICT_TRANS_TABLES。要想在第1場合防止問題的出現(xiàn),不要使用mysql來檢查列的內(nèi)容。最安全的方式是,讓應(yīng)用程序負(fù)責(zé),僅將有效值傳遞給數(shù)據(jù)庫。
有了嚴(yán)格的模式選項后,可使用insert ignore 或 update ignore 而不是不帶ignore的insert或update,將錯誤當(dāng)做警告對待。
總結(jié)
以上是生活随笔為你收集整理的mysql 查数据 default无效_导入mysql数据的时候提示Field * doesn't have a default value解决方法...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql筛选字符个数为8的_听说Mys
- 下一篇: mysql 10分钟_10分钟入门mys