摘要:可以動(dòng)態(tài)改變,但是計(jì)算自增字段取值的時(shí)候,不會(huì)受已經(jīng)存在的數(shù)據(jù)影響,計(jì)算方式不變。例如對做了聯(lián)合索引,是自增字段,那么對這個(gè)條件下的數(shù)據(jù)做獨(dú)立的增長計(jì)算。
1 前言
本文來自回答思否網(wǎng)友的一個(gè)問題,這個(gè)網(wǎng)友新建了一張表,auto_increment_increment設(shè)為10,AUTO_INCREMENT主鍵起始值設(shè)為9, 當(dāng)他插入數(shù)據(jù)的時(shí)候,發(fā)現(xiàn)主鍵值是從11開始的,所以產(chǎn)生了疑惑。這篇文章一起來討論一下自增字段問題。
2 自增字段計(jì)算方式自增字段取值和auto_increment_increment參數(shù)和auto_increment_offset參數(shù)有關(guān),auto_increment_offset參數(shù)設(shè)置的是自增字段偏移值,也就是計(jì)算起始值,auto_increment_increment參數(shù)設(shè)置的是自增字段的步長,也就是每次增加多少。auto_increment_increment和auto_increment_offset經(jīng)常用在主主復(fù)制中防止主鍵重復(fù)。auto_increment_increment為Integer類型,取值1-65535,如果設(shè)置為0,會(huì)改為1,如果設(shè)置超過取值范圍,會(huì)改為65535。
自增字段的取值是通過auto_increment_offset + N × auto_increment_increment這個(gè)公式計(jì)算出來的,而N是一個(gè)類似于[1,2,3,...]這樣的遞增序列。當(dāng)插入一條數(shù)據(jù)時(shí),數(shù)據(jù)庫會(huì)從auto_increment_offset + N × auto_increment_increment計(jì)算出來的遞增數(shù)列中取大于等于當(dāng)前AUTO_INCREMENT的最小一個(gè)元素作為該字段下一個(gè)自增的值。
auto_increment_increment可以動(dòng)態(tài)改變,但是計(jì)算自增字段取值的時(shí)候,不會(huì)受已經(jīng)存在的數(shù)據(jù)影響,計(jì)算方式不變。
下面讓我們做一些測試
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)
我們先創(chuàng)建了一個(gè)包含自增字段的表,把步長設(shè)為10, 插入數(shù)據(jù)發(fā)現(xiàn)增長確實(shí)是公式中計(jì)算的值。下面我們再測試一下建表時(shí)設(shè)置AUTO_INCREMENT是否會(huì)有影響
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)
可以看到即使設(shè)置了AUTO_INCREMENT的值,也不影響自增字段的計(jì)算
3 其他情況上面那是正常情況下的取值,下面我們探討一種特殊情況
3.1 根據(jù)分組自增長有一種特殊情況會(huì)造成自增長字段可能不會(huì)自增長, 就是當(dāng)使用 MyISAM引擎,且使用了聯(lián)合索引,自增字段為非聯(lián)合索引首個(gè)字段。
這種情況下,自增字段取值為MAX(auto_increment_column) + auto_increment_offset WHERE prefix=given-prefix, 怎么理解,就是計(jì)算增長值的時(shí)候,對聯(lián)合索引自增長字段前面字段做一個(gè)分組,在該分組內(nèi)做一個(gè)獨(dú)立的增長計(jì)算。
例如對a,b,c做了聯(lián)合索引,c是自增字段,那么對where a=xx and b=xx這個(gè)條件下的數(shù)據(jù)做獨(dú)立的增長計(jì)算。下面是實(shí)例:
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)
從結(jié)果可以看出,在name字段相同的字段內(nèi),會(huì)有獨(dú)立的自增長計(jì)算,這種計(jì)算方式在做group by的時(shí)候非常方便。
參考:
https://dev.mysql.com/doc/ref...
https://dev.mysql.com/doc/ref...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/17843.html
閱讀 1333·2021-11-23 09:51
閱讀 750·2021-11-19 09:40
閱讀 1403·2021-10-11 10:58
閱讀 2481·2021-09-30 09:47
閱讀 3803·2021-09-22 15:55
閱讀 2287·2021-09-03 10:49
閱讀 1341·2021-09-03 10:33
閱讀 781·2019-08-29 17:12