您好,登錄后才能下訂單哦!
本文主要給大家介紹MySQL自增字段取值,文章內容都是筆者用心摘選和編輯的,具有一定的針對性,對大家的參考意義還是比較大的,下面跟筆者一起了解下MySQL自增字段取值吧。
1 前言
本文來自回答思否網友的一個問題,這個網友新建了一張表,auto_increment_increment設為10,AUTO_INCREMENT主鍵起始值設為9, 當他插入數據的時候,發現主鍵值是從11開始的,所以產生了疑惑。這篇文章一起來討論一下自增字段問題。
2 自增字段計算方式
自增字段取值和auto_increment_increment參數和auto_increment_offset參數有關,auto_increment_offset參數設置的是自增字段偏移值,也就是計算起始值,auto_increment_increment參數設置的是自增字段的步長,也就是每次增加多少。auto_increment_increment和auto_increment_offset經常用在主主復制中防止主鍵重復。auto_increment_increment為Integer類型,取值1-65535,如果設置為0,會改為1,如果設置超過取值范圍,會改為65535。
自增字段的取值是通過auto_increment_offset + N × auto_increment_increment這個公式計算出來的,而N是一個類似于[1,2,3,...]這樣的遞增序列。當插入一條數據時,數據庫會從auto_increment_offset + N × auto_increment_increment計算出來的遞增數列中取大于等于當前AUTO_INCREMENT的最小一個元素作為該字段下一個自增的值。
auto_increment_increment可以動態改變,但是計算自增字段取值的時候,不會受已經存在的數據影響,計算方式不變。
下面讓我們做一些測試
db83-3306>>SET @@auto_increment_increment=10; Query OK, 0 rows affected (0.00 sec) db83-3306>>SHOW VARIABLES LIKE 'auto_inc%'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | auto_increment_increment | 10 | | auto_increment_offset | 1 | +--------------------------+-------+ 2 rows in set (0.00 sec) db83-3306>>CREATE TABLE autoinc1( -> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY -> ) engine=InnoDB; Query OK, 0 rows affected (0.01 sec) db83-3306>>INSERT INTO autoinc1 VALUES (NULL), (NULL), (NULL), (NULL); Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0 db83-3306>>select * from autoinc1; +----+ | id | +----+ | 1 | | 11 | | 21 | | 31 | +----+ 4 rows in set (0.00 sec)
我們先創建了一個包含自增字段的表,把步長設為10, 插入數據發現增長確實是公式中計算的值。下面我們再測試一下建表時設置AUTO_INCREMENT是否會有影響
db83-3306>>CREATE TABLE autoinc2( -> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY -> ) engine=InnoDB AUTO_INCREMENT=8; Query OK, 0 rows affected (0.01 sec) db83-3306>>INSERT INTO autoinc2 VALUES (NULL), (NULL), (NULL), (NULL); Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0 db83-3306>>select * from autoinc2; +----+ | id | +----+ | 11 | | 21 | | 31 | | 41 | +----+ 4 rows in set (0.00 sec)
可以看到即使設置了AUTO_INCREMENT的值,也不影響自增字段的計算
3 其他情況
上面那是正常情況下的取值,下面我們探討一種特殊情況
3.1 根據分組自增長
有一種特殊情況會造成自增長字段可能不會自增長, 就是當使用 MyISAM引擎,且使用了聯合索引,自增字段為非聯合索引首個字段。
這種情況下,自增字段取值為MAX(auto_increment_column) + auto_increment_offset WHERE prefix=given-prefix, 怎么理解,就是計算增長值的時候,對聯合索引自增長字段前面字段做一個分組,在該分組內做一個獨立的增長計算。
例如對a,b,c做了聯合索引,c是自增字段,那么對where a=xx and b=xx這個條件下的數據做獨立的增長計算。下面是實例:
db83-3306>>CREATE TABLE user_pets ( -> name varchar(16) NOT NULL, -> id_inc INT NOT NULL AUTO_INCREMENT, -> pets varchar(16) NOT NULL, -> PRIMARY KEY (name, id_inc) -> ) ENGINE=MyISAM; Query OK, 0 rows affected (0.00 sec) db83-3306>>INSERT INTO user_pets(name, pets) VALUES -> ('chengqm', 'dog'), -> ('chengqm', 'cat'), -> ('chengqm', 'fish'), -> ('yexm', 'dog'), -> ('yexm', 'cat'), -> ('yexm', 'fish'); Query OK, 6 rows affected (0.00 sec) Records: 6 Duplicates: 0 Warnings: 0 db83-3306>>SELECT * FROM user_pets; +---------+--------+------+ | name | id_inc | pets | +---------+--------+------+ | chengqm | 1 | dog | | chengqm | 11 | cat | | chengqm | 21 | fish | | yexm | 1 | dog | | yexm | 11 | cat | | yexm | 21 | fish | +---------+--------+------+ 6 rows in set (0.00 sec)
從結果可以看出,在name字段相同的字段內,會有獨立的自增長計算,這種計算方式在做group by的時候非常方便。
看完以上關于什么是MySQL自增字段取值,很多讀者朋友肯定多少有一定的了解,如需獲取更多的行業知識信息 ,可以持續關注我們的行業資訊欄目的。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。