欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL自增主鍵ID設(shè)置為0有坑

 更新時(shí)間:2025年06月18日 09:38:30   作者:Muscleheng  
本文主要介紹了MySQL自增主鍵插入ID=0會(huì)被自動(dòng)替換為下一個(gè)自增值,導(dǎo)致數(shù)據(jù)關(guān)聯(lián)異常,原因在于系統(tǒng)將0視為未指定值,可通過(guò)修改SQL模式解決,感興趣的可以了解一下

場(chǎng)景:A、B兩個(gè)數(shù)據(jù)庫(kù)有同樣的一個(gè)T表,從A庫(kù)T表導(dǎo)出數(shù)據(jù)、導(dǎo)入到B庫(kù)T表,導(dǎo)入成功后發(fā)現(xiàn)T表中有一條數(shù)據(jù)和其他表數(shù)據(jù)關(guān)聯(lián)不上了,通過(guò)排查才發(fā)現(xiàn),T表中的id為自增主鍵,有一條數(shù)據(jù)的id為0,導(dǎo)入到B庫(kù)的T表后id不再是0,而是下一個(gè)自增值,所以其他表如果是如果該id來(lái)和T表關(guān)聯(lián),那自然是關(guān)聯(lián)不上。

 PS:同一個(gè)表里面導(dǎo)出數(shù)據(jù)后再重新導(dǎo)入也會(huì)出現(xiàn)同樣的問(wè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了,變成了下一個(gè)自增值。

二、原因

在 MySQL 中,當(dāng)表有一個(gè)自增主鍵列(AUTO_INCREMENT)時(shí),如果你嘗試插入 ID=0 的記錄,實(shí)際插入的 ID 不會(huì)保持為 0,而是會(huì)使用下一個(gè)自增值。
因?yàn)槟J(rèn)情況下,MySQL 將 ID=0 的插入請(qǐng)求視為"未指定值",因此會(huì)使用自增序列中的下一個(gè)可用值。
這種行為可以通過(guò) SQL 模式控制:如果啟用了 NO_AUTO_VALUE_ON_ZERO SQL 模式,MySQL 會(huì)允許插入 ID=0,默認(rèn)情況下這個(gè)模式是禁用的。

三、解決方案

1. 手動(dòng)修改數(shù)據(jù)

不正規(guī)。 

2. 臨時(shí)修改 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值,這可能會(huì)導(dǎo)致某些奇奇怪怪的問(wèn)題。

到此這篇關(guān)于MySQL自增主鍵ID設(shè)置為0有坑的文章就介紹到這了,更多相關(guān)MySQL自增主鍵ID設(shè)置為0內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 對(duì)比分析MySQL語(yǔ)句中的IN 和Exists

    對(duì)比分析MySQL語(yǔ)句中的IN 和Exists

    mysql中in 是把外表和內(nèi)表作hash 連接,而exists是對(duì)外表作loop循環(huán),每次loop循環(huán)再對(duì)內(nèi)表進(jìn)行查詢。一直以來(lái)認(rèn)為exists比in效率高的說(shuō)法是不準(zhǔn)確的。
    2018-06-06
  • mysql的存儲(chǔ)過(guò)程、游標(biāo) 、事務(wù)實(shí)例詳解

    mysql的存儲(chǔ)過(guò)程、游標(biāo) 、事務(wù)實(shí)例詳解

    這篇文章主要介紹了mysql的存儲(chǔ)過(guò)程、游標(biāo) 、事務(wù)實(shí)例詳解的相關(guān)資料,這里舉實(shí)例說(shuō)明MySQL 存儲(chǔ)過(guò)程與游標(biāo)和事務(wù),需要的朋友可以參考下
    2017-08-08
  • 簡(jiǎn)單介紹MySQL中索引的使用方法

    簡(jiǎn)單介紹MySQL中索引的使用方法

    這篇文章主要介紹了簡(jiǎn)單介紹MySQL中索引的使用方法,是MySQL入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-05-05
  • MySQL 橫向衍生表(Lateral Derived Tables)的實(shí)現(xiàn)

    MySQL 橫向衍生表(Lateral Derived Tables)的實(shí)現(xiàn)

    橫向衍生表適用于在需要通過(guò)子查詢獲取中間結(jié)果集的場(chǎng)景,相對(duì)于普通衍生表,橫向衍生表可以引用在其之前出現(xiàn)過(guò)的表名,本文就來(lái)介紹一下MySQL 橫向衍生表(Lateral Derived Tables)的實(shí)現(xiàn),感興趣的可以了解一下
    2025-06-06
  • Mysql中的表分區(qū)使用解讀

    Mysql中的表分區(qū)使用解讀

    這篇文章主要介紹了Mysql中的表分區(qū)使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • MySQL自定義函數(shù)簡(jiǎn)單用法示例

    MySQL自定義函數(shù)簡(jiǎn)單用法示例

    這篇文章主要介紹了MySQL自定義函數(shù)簡(jiǎn)單用法,結(jié)合實(shí)例形式分析了mysql自定義函數(shù)的基本定義、使用方法及操作注意事項(xiàng),需要的朋友可以參考下
    2018-12-12
  • MySQL之存儲(chǔ)引擎使用及說(shuō)明

    MySQL之存儲(chǔ)引擎使用及說(shuō)明

    這篇文章主要介紹了MySQL之存儲(chǔ)引擎使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • mysql常用函數(shù)與視圖索引全面梳理

    mysql常用函數(shù)與視圖索引全面梳理

    這篇文章主要介紹了mysql的常用函數(shù)與視圖索引的特點(diǎn)與作用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-10-10
  • mysql中的判斷函數(shù)和分支語(yǔ)句詳解

    mysql中的判斷函數(shù)和分支語(yǔ)句詳解

    本文介紹了SQL中常用的判斷函數(shù)和分支語(yǔ)句,判斷函數(shù)包括if()、ifnull()以及nullif(),用于處理數(shù)據(jù)判斷和空值處理,分支語(yǔ)句分為多條件判斷和固定值判斷,便于根據(jù)不同條件執(zhí)行相應(yīng)邏輯,這些功能在數(shù)據(jù)處理和查詢中非常實(shí)用
    2024-10-10
  • mysql優(yōu)化利器之explain使用介紹

    mysql優(yōu)化利器之explain使用介紹

    這篇文章主要介紹了mysql優(yōu)化利器之explain使用介紹,需要的朋友可以參考下
    2017-01-01

最新評(píng)論