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()函数。
我们通常在后续语句中使用最后一个插入ID,例如,将数据插入表中。
最后生成的序列在会话中是唯一的。
换句话说,如果另一个连接生成了序列号,则可以使用LAST_INSERT_ID()函数从您的连接中获取序列号。如果在表中插入新行并为sequence列指定一个值,则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');
其次,从雇员表中选择数据:
SELECT * FROM employees;
第三,删除第二个雇员,其emp_no为2:
DELETE FROM employees WHERE emp_no = 2;
第四,插入新员工:
INSERT INTO employees(first_name,last_name) VALUES('Hyman','Lee');
因为employee表的存储引擎是InnoDB,所以它不会重复使用已删除的序列号。
新行具有emp_no 3。
第五,将emp_no 3的现有员工更新为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;
第六,将序列号更新为10后插入新员工:
INSERT INTO employees(first_name,last_name) VALUES('Wang','Lee');
最后插入的下一个序列号是数字4,因此,MySQL对新行使用数字4而不是11。
在本教程中,您学习了如何通过使用MySQL序列为主键列生成唯一数字,方法是为该列分配AUTO_INCREMENT属性。