MySQL自增主鍵ID設(shè)置為0有坑
場景:A、B兩個數(shù)據(jù)庫有同樣的一個T表,從A庫T表導(dǎo)出數(shù)據(jù)、導(dǎo)入到B庫T表,導(dǎo)入成功后發(fā)現(xiàn)T表中有一條數(shù)據(jù)和其他表數(shù)據(jù)關(guān)聯(lián)不上了,通過排查才發(fā)現(xiàn),T表中的id為自增主鍵,有一條數(shù)據(jù)的id為0,導(dǎo)入到B庫的T表后id不再是0,而是下一個自增值,所以其他表如果是如果該id來和T表關(guān)聯(lián),那自然是關(guān)聯(lián)不上。
PS:同一個表里面導(dǎo)出數(shù)據(jù)后再重新導(dǎo)入也會出現(xiàn)同樣的問題。
一、實(shí)踐一下
創(chuàng)建表:
CREATE TABLE `dept` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
添加數(shù)據(jù),把其中一條數(shù)據(jù)id修改為0
導(dǎo)出數(shù)據(jù)后清除數(shù)據(jù)再執(zhí)行SQL導(dǎo)入:
INSERT INTO `dept` (`id`, `name`) VALUES (0, '數(shù)據(jù)1'); INSERT INTO `dept` (`id`, `name`) VALUES (2, '數(shù)據(jù)2');
導(dǎo)入后的數(shù)據(jù)情況:
可以看到,導(dǎo)出后重新導(dǎo)入,id為0的數(shù)據(jù)變成3了,變成了下一個自增值。
二、原因
在 MySQL 中,當(dāng)表有一個自增主鍵列(AUTO_INCREMENT)時,如果你嘗試插入 ID=0 的記錄,實(shí)際插入的 ID 不會保持為 0,而是會使用下一個自增值。
因?yàn)槟J(rèn)情況下,MySQL 將 ID=0 的插入請求視為"未指定值",因此會使用自增序列中的下一個可用值。
這種行為可以通過 SQL 模式控制:如果啟用了 NO_AUTO_VALUE_ON_ZERO SQL 模式,MySQL 會允許插入 ID=0,默認(rèn)情況下這個模式是禁用的。
三、解決方案
1. 手動修改數(shù)據(jù)
不正規(guī)。
2. 臨時修改 SQL 模式:
SET SESSION sql_mode='NO_AUTO_VALUE_ON_ZERO'; INSERT INTO your_table (id, ...) VALUES (0, ...);
3. 永久修改 SQL 模式(在 my.cnf/my.ini 中)
不推薦:
sql_mode=NO_AUTO_VALUE_ON_ZERO,...其他模式...
注意:不建議在自增主鍵中插入0值,這可能會導(dǎo)致某些奇奇怪怪的問題。
到此這篇關(guān)于MySQL自增主鍵ID設(shè)置為0有坑的文章就介紹到這了,更多相關(guān)MySQL自增主鍵ID設(shè)置為0內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql的存儲過程、游標(biāo) 、事務(wù)實(shí)例詳解
這篇文章主要介紹了mysql的存儲過程、游標(biāo) 、事務(wù)實(shí)例詳解的相關(guān)資料,這里舉實(shí)例說明MySQL 存儲過程與游標(biāo)和事務(wù),需要的朋友可以參考下2017-08-08MySQL 橫向衍生表(Lateral Derived Tables)的實(shí)現(xiàn)
橫向衍生表適用于在需要通過子查詢獲取中間結(jié)果集的場景,相對于普通衍生表,橫向衍生表可以引用在其之前出現(xiàn)過的表名,本文就來介紹一下MySQL 橫向衍生表(Lateral Derived Tables)的實(shí)現(xiàn),感興趣的可以了解一下2025-06-06