MySQL AUTO_INCREMENT 主鍵自增長的實現(xiàn)
在 MySQL 中,當(dāng)主鍵定義為自增長后,這個主鍵的值就不再需要用戶輸入數(shù)據(jù)了,而由數(shù)據(jù)庫系統(tǒng)根據(jù)定義自動賦值。每增加一條記錄,主鍵會自動以相同的步長進(jìn)行增長。
通過給字段添加 AUTO_INCREMENT 屬性來實現(xiàn)主鍵自增長。語法格式如下:
字段名 數(shù)據(jù)類型 AUTO_INCREMENT
- 默認(rèn)情況下,AUTO_INCREMENT 的初始值是 1,每新增一條記錄,字段值自動加 1。
- 一個表中只能有一個字段使用 AUTO_INCREMENT 約束,且該字段必須有唯一索引,以避免序號重復(fù)(即為主鍵或主鍵的一部分)。
- AUTO_INCREMENT 約束的字段必須具備 NOT NULL 屬性。
- AUTO_INCREMENT 約束的字段只能是整數(shù)類型(TINYINT、SMALLINT、INT、BIGINT 等)。
- AUTO_INCREMENT 約束字段的最大值受該字段的數(shù)據(jù)類型約束,如果達(dá)到上限,AUTO_INCREMENT 就會失效。
例 1
定義數(shù)據(jù)表 tb_student,指定表中 id 字段遞增,SQL 語句和運行結(jié)果如下:
mysql> CREATE TABLE tb_student(
-> id INT(4) PRIMARY KEY AUTO_INCREMENT,
-> name VARCHAR(25) NOT NULL
-> );
Query OK, 0 rows affected (0.07 sec)上述語句執(zhí)行成功后,會創(chuàng)建名為 tb_student 的數(shù)據(jù)表。其中,id 為主鍵,每插入一條新記錄,id 的值就會在前一條記錄的基礎(chǔ)上自動加 1。name 為非空字段,該字段的值不能為空值(NULL)。
向 tb_student 表中插入數(shù)據(jù),SQL 語句如下所示:
INSERT INTO tb_student(name) VALUES('Java')('MySQL')('Python');語句執(zhí)行完后,tb_student 表中增加了 3 條記錄,在這里并沒有輸入 id 的值,但系統(tǒng)已經(jīng)自動添加該值,使用 SELECT 命令查看記錄,如下所示。
mysql> SELECT * FROM tb_student; +----+--------+ | id | name | +----+--------+ | 1 | Java | | 2 | MySQL | | 3 | Python | +----+--------+ 4 rows in set (0.01 sec)
拓展
加上 AUTO_INCREMENT 約束條件后,字段中的每個值都是自動增加的。因此,這個字段不可能出現(xiàn)相同的值。通常情況下,AUTO_INCREMENT 都是作為 id 字段的約束條件,并且將 id 字段作為表的主鍵。
指定自增字段初始值
如果第一條記錄設(shè)置了該字段的初始值,那么新增加的記錄就從這個初始值開始自增。例如,如果表中插入的第一條記錄的 id 值設(shè)置為 5,那么再插入記錄時,id 值就會從 5 開始往上增加。
例 2
下面創(chuàng)建表 tb_student2,指定主鍵從 100 開始自增長。SQL 語句和運行結(jié)果如下:
mysql> CREATE TABLE tb_student2 (
-> id INT NOT NULL AUTO_INCREMENT,
-> name VARCHAR(20) NOT NULL,
-> PRIMARY KEY(ID)
-> )AUTO_INCREMENT=100;
Query OK, 0 rows affected (0.03 sec)向 tb_student2 表中插入數(shù)據(jù),并使用 SELECT 命令查詢表中記錄。
mysql> INSERT INTO tb_student2 (name)VALUES('Java');
Query OK, 1 row affected (0.07 sec)
mysql> SELECT * FROM tb_student2;
+-----+------+
| id | name |
+-----+------+
| 100 | Java |
+-----+------+由結(jié)果可以看出,id 值從 100 開始自動增長。
自增字段值不連續(xù)
下面我們通過一個實例分析自增字段的值為什么不連續(xù)。
例 3
創(chuàng)建表 tb_student3,其中 id 是自增主鍵字段,name 是唯一索引,SQL 語句和執(zhí)行結(jié)果語句如下:
mysql> CREATE TABLE tb_student3(
-> id INT PRIMARY KEY AUTO_INCREMENT,
-> name VARCHAR(20) UNIQUE KEY,
-> age INT DEFAULT NULL
-> );
Query OK, 0 rows affected (0.04 sec)向 tb_student3 表中插入數(shù)據(jù),SQL 語句如下:
INSERT INTO tb_student3 VALUES(1,1,1);
此時,表 tb_student3 中已經(jīng)有了(1,1,1)這條記錄,這時再執(zhí)行一條插入數(shù)據(jù)命令:
mysql> INSERT INTO tb_student3 VALUES(null,1,1); ERROR 1062 (23000): Duplicate entry '1' for key 'name'
由于表中已經(jīng)存在 name=1 的記錄,所以報 Duplicate key error(唯一鍵沖突)。在這之后,再插入新的數(shù)據(jù)時,自增 id 就是 3,這樣就出現(xiàn)了自增字段值不連續(xù)的情況。
到此這篇關(guān)于MySQL AUTO_INCREMENT 主鍵自增長的實現(xiàn)的文章就介紹到這了,更多相關(guān)MySQL AUTO_INCREMENT 主鍵自增長內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MySQL自增鎖(Auto-Increment Lock) 的原理使用
- mysql?自增長約束(auto_increment)的使用
- MySQL自增列解析(Auto_increment)
- MySQL中使用auto_increment修改初始值和步長
- 詳細(xì)聊聊MySQL中auto_increment有什么作用
- MySQL 序列 AUTO_INCREMENT詳解及實例代碼
- MySQL查詢和修改auto_increment的方法
- 解析mysql中的auto_increment的問題
- 怎么重置mysql的自增列AUTO_INCREMENT初時值
- MySQL 設(shè)置AUTO_INCREMENT 無效的問題解決
相關(guān)文章
MySql 5.7.17 winx64的安裝配置詳細(xì)教程
這篇文章主要介紹了MySql 5.7.17 winx64的安裝配置教程,初始化數(shù)據(jù)庫、配置相關(guān)信息的方法在本文中介紹的非常詳細(xì),需要的朋友參考下2017-01-01
MySQL數(shù)據(jù)庫遭到攻擊篡改(使用備份和binlog進(jìn)行數(shù)據(jù)恢復(fù))
這篇文章主要介紹了MySQL數(shù)據(jù)庫遭到攻擊篡改(使用備份和binlog進(jìn)行數(shù)據(jù)恢復(fù)),需要的朋友可以參考下2016-04-04
MySQL?的ANALYZE與?OPTIMIZE命令(最佳實踐指南)
MySQL的ANALYZE?TABLE更新統(tǒng)計信息優(yōu)化查詢性能,OPTIMIZE TABLE重組表結(jié)構(gòu)回收空間,二者鎖級別與執(zhí)行時間不同,建議定期維護(hù)、備份并監(jiān)控,結(jié)合工具跟蹤表健康狀況以保持?jǐn)?shù)據(jù)庫穩(wěn)定運行,本文給大家介紹MySQL的ANALYZE與OPTIMIZE命令,感興趣的朋友一起看看吧2025-07-07
在 Windows 10 上安裝 解壓縮版 MySql(推薦)
這篇文章主要介紹了在 Windows 10 上安裝 解壓縮版 MySql(推薦)的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-12-12
如何解決MySQL5升級為MySQL8遇到的問題my.ini
這篇文章主要介紹了如何解決MySQL5升級為MySQL8遇到的問題my.ini,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12
Sphinx/MySQL 協(xié)議支持與SphinxQL應(yīng)用實例
Sphinx/MySQL 協(xié)議支持與SphinxQL應(yīng)用例子,供大家學(xué)習(xí)參考2013-02-02

