MySQL序列

时间:2019-11-20 08:52:09  来源:igfitidea点击:

简介:在本教程中,您将学习如何使用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属性。