mysql 如何修改主鍵起始值?


1.情景展示

在實際開發中,往往會存在這種需求:

將A表當中的數據導入B表,后面繼續使用B表。

由上一篇,我們了解到:

B表如果是通過create table b as select * from a的方式,將會導致的其中一個結果就是:

B表沒有指定主鍵列。

2.具體分析

現在的問題在於:

假如,我們現在還將ID列作為主鍵,並且設置成自增列的話,該ID的起始值將是多少?

一起來實際操作一下吧:

第一步:將ID列設置成主鍵;

第二步:取消勾選“自動遞增”;

第三步:將主鍵列的默認值清空。

點擊保存。

使用建表語句,看一下序列的起始值;

序列的起始值為:9;

我們再來運行一下建表語句:

show CREATE TABLE cz_jkdic_bak;

添加主鍵前:

添加主鍵后:

\

我們可以看到:

建表語句,除了增加了主鍵列外,還設置了自增的起始值:AUTO_INCREMENT=9。

我們來看一下當前主鍵列的最大值:

最大值為8,這,也就是說:mysql會自動將現有主鍵列的最大值+1,當作自增的起始值;

這一點還是非常不錯的,這樣一來,我們就無需擔心主鍵沖突的問題,也不用手動去改主鍵序列的起始值啦。

3.解決方案

如何修改主鍵起始值?

錯誤方式一:修改AUTO_INCREMENT;

語法:

ALTER TABLE 表名 AUTO_INCREMENT=起始值

顯示執行成功,我們再可以查看一下建表語句;

2022年5月23日19:24:32

雖然,建表語句的自增長起始值發生了改變,但是,然並卵。

我們在插入數據的時候,主鍵依然按照原來的值的基礎上+1(8+1)。

在mysql客戶端當中,有一個bug會讓我們這樣的錯覺:

誤以為,這種方式值有效的。

誠然,在Navicat當中,進行新增的時候,是生效的。

但是,我們切換到對象,可以看到該表的自增值。

我們可以清楚的看到:

該表主鍵列的自增值並未發生改變。

而且,我們操作數據,一般是通過程序操作,而不是直接操作數據庫。

同樣地,在SQLYog當中,我們再試一次:

選中表,右鍵,改變表;

查看表主鍵。

我們可以看到:表主鍵的自增值,依舊沒有改變。

結論:通過這種實現方式,只對當前客戶端有效,並未修改表的主鍵值,無論是相較與當前數據主鍵的最大值,將主鍵值調大或者調小。

當自增值為NULL或0的時候,這種方式會起作用。

錯誤方式二:SQLyog工具。

鼠標選中要修改的表,快捷鍵:F6;

自動增量,這一欄就是序列的下一個值;

修改之后,保存。

雖然顯示:已經修改成功,但是,我們會發現:自增值並未發生改變。

2022年5月23日19:59:07

mysql主鍵特性:

mysql的自增列,有以下特性:

每次增加的值為1;

在取自增值時,會先去查當前主鍵的最大值,然后和當前自增值進行比對:

如果,自增值>現有數據主鍵的最大值,則取自增值,作為新數據的主鍵;

反之,自增值<=現有數據主鍵的最大值,則取現有數據主鍵的最大值+1,作為新數據的主鍵。

mysql的自增列的值,一般情況下,只會越來越大,是無法人為手動變小的。

正確實現方式:

第一步:復制表;

CREATE TABLE meta_theme_bak as SELECT * FROM meta_theme

我們可以看到:

此時,備份表的自增列的值為0。 

 

注意:使用這種復制表的方式,會導致主鍵、索引等相關信息的丟失。

第二步:刪除舊表;

DROP TABLE meta_theme

 

第三步:對備份表進行重命名;

第四步:重新設置表主鍵、索引、表名注釋等相關信息。

添加主鍵,並勾選“自動遞增”,保存。

隨后,我們可以看到,表的主鍵自增值已經改成了在原有數據最大值的基礎上+1。

還有一種實現方式:清空表數據

表數據被清空后,我們依然可以發現:

表的自增值並未發生任何變化。

select
	auto_increment 
from
	information_schema.`tables` 
where
	table_name = '表名' 
	and table_schema = '數據庫名'

但是,我們在實際插入數據的時候,表主鍵已經從1重新開始了。

由此可見,表的AUTO_INCREMENT並不可信,只有在實際插入的時候,我們才知道主鍵會是多少!

寫在最后

  哪位大佬如若發現文章存在紕漏之處或需要補充更多內容,歡迎留言!!!

 相關推薦:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM