MySQL 序列
简介:在本教程中,我们将向您展示如何使用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列:
CREATE TABLE employees (
emp_no INT AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50)
);
MySQL序列如何工作
AUTO_INCREMENT列具有以下属性:
AUTO_INCREMENT列的起始值为1,当您NULL向列中插入值或在INSERT语句中省略其值时,它会增加1 。
要获取最后生成的序列号,请使用LAST_INSERT_ID()函数获取序列号。
如果在表中插入新行并为序列列指定值,则如果列中不存在序列号,则MySQL将插入序列号,如果已存在则发出错误。如果插入一个大于下一个序列号的新值,MySQL将使用新值作为起始序列号,并生成一个大于当前序列号的唯一序列号,以供下次使用。这会在序列中产生间隙。
如果使用UPDATE语句将AUTO_INCREMENT列中的值更新 为已存在的值,则如果列具有唯一索引,MySQL将发出重复键错误。如果将AUTO_INCREMENT列更新为大于列中现有值的值,MySQL将使用下一行的最后一个插入序列号的下一个数字。例如,如果最后一个插入序列号为3,则将其更新为10,新行的序列号为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表中选择数据:
SELECT * FROM employees;
+--------+------------+-----------+
| emp_no | first_name | last_name |
+--------+------------+-----------+
| 1 | John | Doe |
| 2 | Mary | Jane |
+--------+------------+-----------+
2 rows in set (0.00 sec)
第三,删除第二名员工,emp_no即2:
DELETE FROM employees
WHERE
emp_no = 2;
mysql> SELECT * FROM employees;
+--------+------------+-----------+
| emp_no | first_name | last_name |
+--------+------------+-----------+
| 1 | John | Doe |
+--------+------------+-----------+
1 row in set (0.00 sec)
第四,插入一名新员工:
INSERT INTO employees(first_name,last_name)
VALUES('Jack','Lee');
mysql> SELECT * FROM employees;
+--------+------------+-----------+
| emp_no | first_name | last_name |
+--------+------------+-----------+
| 1 | John | Doe |
| 3 | Jack | Lee |
+--------+------------+-----------+
2 rows in set (0.00 sec)
因为employees表的存储引擎是InnoDB,所以它不会重用已删除的序列号。新行emp_no 为3。
第五,将emp_no 为3员工更新为1 :
UPDATE employees
SET
first_name = 'Joe',
emp_no = 1
WHERE
emp_no = 3;
MySQL发出主键重复输入错误。
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
我们来解决它。
UPDATE employees
SET
first_name = 'Joe',
emp_no = 10
WHERE
emp_no = 3;
mysql> select * from employees;
+--------+------------+-----------+
| emp_no | first_name | last_name |
+--------+------------+-----------+
| 1 | John | Doe |
| 10 | Joe | Lee |
+--------+------------+-----------+
2 rows in set (0.00 sec)
第六,在将序列号更新为10后插入新员工:
INSERT INTO employees(first_name,last_name)
VALUES('Wang','Lee');
mysql> select * from employees;
+--------+------------+-----------+
| emp_no | first_name | last_name |
+--------+------------+-----------+
| 1 | John | Doe |
| 4 | Wang | Lee |
| 10 | Joe | Lee |
+--------+------------+-----------+
3 rows in set (0.00 sec)
最后一个插入的下一个序列号是4,因此,MySQL使用4号作为新行而不是11行。
在本教程中,您已经学习了如何使用MySQL序列通过将AUTO_INCREMENT属性分配给列来为主键列生成唯一编号 。