MySQL-使用自增ID無法插入ID爲0值的記錄的問題分析

記錄一次數據庫備份還原過程中的問題,以便今後遇到該問題能迅速定位。

問題產生的背景
1、數據庫中表使用的是自增ID
2、在項目開發過程中數據庫分爲開發庫和生產庫,由於業務邏輯的需要,在生產庫中把其中一個表的一條記錄的ID手動改成了0。
3、備份生產庫導入開發庫過程中

問題
1、項目運行後,發現數據出現了嚴重的偏差,一些關聯查詢的數據不對,一開始以爲是備份數據庫或者導入數據庫過程中出現了問題,來來回回折騰了幾次,問題依舊。
2、追尋出問題的數據,查詢數據庫,發現ID手動改爲0的那條記錄被插入到最後一條記錄,當然ID也不是0了。查看備份的源文件,生成的insert語句中這條記錄的ID確實是0。難道產生了幻覺。

原因分析
1、因爲在數據庫表中ID採用了自增ID策略。默認情況下當ID是0或者null的時候,數據庫會自動產生一個新的自增序列作爲這條記錄的ID。這就是我們插入0值ID記錄時與期望不符原因。

看一下官方解釋以及解決方案
1、最權威的還是官網解釋
https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sqlmode_no_auto_value_on_zero
在這裏插入圖片描述2、大體意思就是說默認情況下,自增列插入null或者0的時候數據庫會產生一個新的自增數值。如果想讓自增列在只插入null的時候產生自增序列。就要提前設置mysql的sql_mode包括NO_AUTO_VALUE_ON_ZERO。
3、如果要還原的數據庫中有很多自增列爲0值的數據,那麼就設置一下sql_mode把,在my.ini或者my.cnf中設置sql_mode
4、在設置sql_mode之前需要查詢數據庫原來擁有那些設置了的mode
SELECT @@sql_mode
在這裏插入圖片描述5、在配置文件中加入
sql_mode = “STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_AUTO_VALUE_ON_ZERO”
在這裏插入圖片描述
6、重啓數據庫,這時候插入0值自增列數據就不會有問題了。

如果導入的數據中只有一條或或者幾條數據,其實不必大費周章,導入後手動改一改也是可以的。
但是不管怎麼樣,我們要知其然,更要知其所以然。

摘選自
原文

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章