在本教學中,我們將向您展示如何使用MySQL序列為表的ID列自動生成唯一編號。
創建MySQL序列
在MySQL中,序列是以昇冪生成的整數列表,即1
,2
,3
...
許多應用程式需要序列來生成主要用於識別的唯一數字,例如:CRM中的客戶ID,HR中的員工編號,伺服器管理系統的設備編號等。
要自動在MySQL中創建序列,可以在列上設置AUTO_INCREMENT
屬性,這通常是主鍵列。
使用AUTO_INCREMENT
屬性時,將應用以下規則:
- 每個表只有一個
AUTO_INCREMENT
列,其數據類型通常為整數。 - 必須對
AUTO_INCREMENT
列進行索引,它可以是PRIMARY KEY或UNIQUE索引。 AUTO_INCREMENT
列必須具有NOT NULL約束。當您為列設置AUTO_INCREMENT
屬性時,MySQL會自動將NOT NULL
約束隱式添加到列中。
創建MySQL序列示例
以下語句創建一個名為employees
的表,其emp_no
列為AUTO_INCREMENT
列:
USE testdb;
CREATE TABLE employees(
emp_no INT(4) AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50)
);
MySQL序列如何工作
AUTO_INCREMENT
列具有以下屬性:
AUTO_INCREMENT
列的起始值為1
,當您向列中插入NULL值或在INSERT語句中省略其值時,它將增加1
。- 要獲取最後生成的序列號,請使用LAST_INSERT_ID()函數。 我們經常要後續語句中使用最後一個插入ID,例如將數據插入到表中。 最後生成的序列在會話中是唯一的。 換句話說,如果另一個連接生成序列號,從連接中可以使用
LAST_INSERT_ID()
函數獲取它。 - 如果將新行插入到表中並指定序列列的值,如果序列號不存在於列中,則MySQL將插入序列號,如果序列號已存在,則會發出錯誤。 如果插入大於下一個序列號的新值,MySQL將使用新值作為起始序列號,並生成大於當前值的唯一序列號。這會在序列中產生一段空白(不連續)。
如果使用UPDATE語句將
AUTO_INCREMENT
列中的值更新為已存在的值,如果該列具有唯一索引,則MySQL將發出重複鍵錯誤。 如果將AUTO_INCREMENT
列更新為大於列中現有值的值,MySQL將使用最後一個插入序列號加1
的值作為下一行列號值。 例如,如果最後一個插入序列號為3
,然後又將其更新為10
,那麼新插入行的序列號不是11
,而是4
。如果使用DELETE語句刪除最後插入的行,MySQL可能會也可能不會根據表的存儲引擎重複使用已刪除的序列號。 如果您刪除一行,則MyISAM表不會重複使用已刪除的序列號,例如,如果刪除表中的最後一個插入
ID
為10
,則MySQL仍會為新行生成11個下一個序列號。 與MyISAM表類似,InnoDB表在行被刪除時不重複使用序列號。
在列上設置AUTO_INCREMENT屬性後,可以以各種方式重置自動增量值,例如使用ALTER TABLE語句。
我們來看一下一些例子來更好地瞭解MySQL序列。
第一步,在employees
表中插入兩行:
INSERT INTO employees(first_name,last_name)
VALUES('John','Doe'),
('Mary','Jane');
第二步,從employees
表中查詢選擇數據:
mysql> SELECT * FROM employees;
+--------+------------+-----------+
| emp_no | first_name | last_name |
+--------+------------+-----------+
| 1 | John | Doe |
| 2 | Mary | Jane |
+--------+------------+-----------+
2 rows in set
第三步,刪除emp_no
為2
的第二個員工資訊:
mysql> DELETE FROM employees
WHERE emp_no = 2;
Query OK, 1 row affected
mysql> SELECT * FROM employees;
+--------+------------+-----------+
| emp_no | first_name | last_name |
+--------+------------+-----------+
| 1 | John | Doe |
+--------+------------+-----------+
1 row in set
第四步,插入新員工,並查詢最後一位員工資訊(emp_no
):
mysql> INSERT INTO employees(first_name,last_name)
VALUES('Jack','Lee');
Query OK, 1 row affected
mysql> SELECT * FROM employees;
+--------+------------+-----------+
| emp_no | first_name | last_name |
+--------+------------+-----------+
| 1 | John | Doe |
| 3 | Jack | Lee |
+--------+------------+-----------+
2 rows in set
因為employees
表的存儲引擎是InnoDB,它不會重複使用已刪除的序列號。 新行使用emp_no
的值是3
。
第五步,將emp_no = 3
已存在新員工更新為emp_no = 1
:
UPDATE employees
SET first_name = 'Joe',
emp_no = 1
WHERE emp_no = 3;
上面語句執行時,MySQL發出主鍵重複條目的錯誤。如何來解決它?
UPDATE employees
SET first_name = 'Joe',
emp_no = 10
WHERE emp_no = 3;
執行結果如下 -
mysql> UPDATE employees
SET first_name = 'Joe',
emp_no = 10
WHERE emp_no = 3;
Query OK, 1 row affected
Rows matched: 1 Changed: 1 Warnings: 0
mysql> SELECT * FROM employees;
+--------+------------+-----------+
| emp_no | first_name | last_name |
+--------+------------+-----------+
| 1 | John | Doe |
| 10 | Joe | Lee |
+--------+------------+-----------+
2 rows in set
上面步驟中,將序列號更新為10
。
第六,插入新員工數據 -
mysql> INSERT INTO employees(first_name,last_name)
VALUES('Wang','Lee');
Query OK, 1 row affected
mysql> SELECT * FROM employees;
+--------+------------+-----------+
| emp_no | first_name | last_name |
+--------+------------+-----------+
| 1 | John | Doe |
| 4 | Wang | Lee |
| 10 | Joe | Lee |
+--------+------------+-----------+
最後插入的下一個序列號是4
,因此,MySQL使用數字是4
作為新行序列值,而不是11
。
在本教學中,您已經學習了如何使用MySQL序列為主鍵列生成唯一的編號,方法是為列設置AUTO_INCREMENT
屬性。