MySQL 入门教程
  • 教程目录
  • 第一章 基础教程
    • 第一节 入门
      • 1.1 安装
      • 1.2 示例数据库
    • 第二节 查询数据
      • 2.1 SELECT 语句
      • 2.2 SELECT DISTINCT 语句
    • 第三节 过滤数据
      • 3.1 WHERE 子句
      • 3.2 AND 运算符
      • 3.3 OR 运算符
      • 3.4 IN 运算符
      • 3.5 BETWEEN 运算符
      • 3.6 LIKE 运算符
      • 3.7 LIMIT 子句
      • 3.8 IS NULL 运算符
    • 第四节 数据排序
      • 4.1 ORDER BY 子句
      • 4.1 自然排序
    • 第五节 连接表
      • 5.1 别名
      • 5.2 INNER JOIN
      • 5.3 LEFT JOIN
      • 5.4 自连接
      • 5.5 CROSS JOIN
    • 第六节 分组数据
      • 6.1 GROUP BY子句
      • 6.2 HAVING 子句
    • 第七节 子查询,派生表和通用表达式
      • 7.1 子查询
      • 7.2 派生表
      • 7.3 公共表表达式
      • 7.4 递归 CTE
    • 第八节 集合操作符
      • 8.1 UNION 和 UNION ALL
      • 8.2 INTERSECT 模拟
    • 第九节 修改数据
      • 9.1 INSERT 语句
      • 9.2 INSERT IGNORE
      • 9.3 UPDATE 语句
      • 9.4 UPDATE JOIN 语句
      • 9.5 DELETE
      • 9.6 ON DELETE CASCADE.
      • 9.7 DELETE JOIN
      • 9.8 REPLACE 语句
      • 9.9 PREPARE 语句
    • 第十节 事务
      • 10.1 事务介绍
      • 10.2 表锁定
    • 第十一节 管理数据库和表
      • 11.1 数据库管理
      • 11.2 MySQL 表类型
      • 11.3 CREATE TABLE
      • 11.4 序列
      • 11.5 ALTER TABLE
      • 11.6 重命名表
      • 11.7 从表中删除列
      • 11.8 向表中添加新列
      • 11.9 删除表
      • 11.10 临时表
      • 11.11 TRUNCATE TABLE
    • 第十二节 索引
      • 12.1 管理索引
      • 12.1 UNIQUE 索引
    • 第十三节 数据类型
      • 13.1 INT
      • 13.2 DECIMAL
      • 13.3 BIT
      • 13.4 BOOLEAN
      • 13.5 CHAR
      • 13.6 VARCHAR
      • 13.7 TEXT
      • 13.8 DATE
      • 13.9 TIME
      • 13.10 DATETIME
      • 13.11 TIMESTAMP
      • 13.12 JSON
      • 13.13 ENUM
    • 第十四节 约束
      • 14.1 NOT NULL 约束
      • 14.2 主键约束
      • 14.2 外键约束
      • 14.4 UNIQUE 约束
      • 14.5 CHECK 约束
    • 第十五节 全球化
      • 15.1 字符集
      • 15.2 校对规则
    • 第十六节 导入和导出
      • 16.1 导入 CSV 文件
      • 16.2 导出为 CSV
  • 第二章 技巧
    • CTE 简介
    • 递归 CTE
    • 邻接列表模型和层次结构
    • 获取行数
    • 比较表
    • 找重复值
    • 删除重复行
    • UUID 和主键
    • 复制表数据
    • 变量
    • 生成列
    • 连续行比较
    • 更改存储引擎
    • 基于正则表达式的搜索
    • row_number 模拟
    • 随机选择记录
    • 选择第 n 个最高纪录
    • 重置自动增量值
    • MariaDB 与 MySQL 比较
    • 间隔
    • NULL 详细和应用
    • 获取今天的日期
    • 将NULL值映射到有意义的值
    • 注释
  • 第三章 存储过程
    • 简介
    • 入门
    • 变量
    • 参数
    • 返回多个值
    • IF语句
    • CASE语句
    • IF和CASE语句的技巧
    • 循环
    • 游标
    • 列出存储过程
    • 错误处理
    • SIGNAL 和 ESIGNAL 语句
    • 存储函数
  • 第四章 触发器
    • 实现
    • 创建
    • 创建多个触发器
    • 管理
    • 计划事件
    • 修改事件
  • 第五章 视图
    • 简介
    • 实现和限制
    • 创建
    • 可更新视图
    • 确保视图一致性
    • 检查选项子句
    • 管理
  • 第六章 全文搜索
    • 简介
    • 定义索引
    • 自然语言全文搜索
    • 布尔全文搜索
    • 查询扩展
    • ngram全文解析器
  • 第七章 函数
  • 第八章 管理
    • 访问控制系统入门
    • 创建用户
    • 授予权限
    • 撤销权限
    • 角色管理
    • 删除用户
    • 维护数据库表
    • 备份数据库
    • 列出数据库
    • 列出表
    • 列出表的列
    • 列出用户
Powered by GitBook
On this page
  • 创建MySQL序列
  • MySQL序列如何工作

Was this helpful?

  1. 第一章 基础教程
  2. 第十一节 管理数据库和表

11.4 序列

Previous11.3 CREATE TABLENext11.5 ALTER TABLE

Last updated 5 years ago

Was this helpful?

在本教程中,我们将向您展示如何使用MySQL序列为表的ID列自动生成唯一编号。

创建MySQL序列

在MySQL中,序列是以升序生成的列表,即1,2,3 ...许多应用程序需要序列来生成主要用于识别的唯一数字,例如:CRM中的客户ID,HR中的员工编号,服务器管理系统的设备编号等。

要自动在MySQL中创建序列,可以在列上设置AUTO_INCREMENT属性,这通常是列。

使用AUTO_INCREMENT属性时,将应用以下规则:

  • 每个表只有一个AUTO_INCREMENT列,其数据类型通常为整数。

  • 必须对AUTO_INCREMENT列进行索引,它可以是或索引。

  • AUTO_INCREMENT列必须具有。当您为列设置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列具有以下属性:

我们来看一下一些例子来更好地了解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属性。

AUTO_INCREMENT列的起始值为1,当您向列中插入值或在语句中省略其值时,它将增加1。

要获取最后生成的序列号,请使用。 我们经常要后续语句中使用最后一个插入ID,例如将数据插入到表中。 最后生成的序列在会话中是唯一的。 换句话说,如果另一个连接生成序列号,从连接中可以使用LAST_INSERT_ID()函数获取它。

如果将并指定序列列的值,如果序列号不存在于列中,则MySQL将插入序列号,如果序列号已存在,则会发出错误。 如果插入大于下一个序列号的新值,MySQL将使用新值作为起始序列号,并生成大于当前值的唯一序列号。这会在序列中产生一段空白(不连续)。

如果使用语句将AUTO_INCREMENT列中的值更新为已存在的值,如果该列具有唯一索引,则MySQL将发出重复键错误。 如果将AUTO_INCREMENT列更新为大于列中现有值的值,MySQL将使用最后一个插入序列号加1的值作为下一行列号值。 例如,如果最后一个插入序列号为3,然后又将其更新为10,那么新插入行的序列号不是11,而是4。

如果使用语句删除最后插入的行,MySQL可能会也可能不会根据表的重复使用已删除的序列号。 如果您删除一行,则MyISAM表不会重复使用已删除的序列号,例如,如果删除表中的最后一个插入ID为10,则MySQL仍会为新行生成11个下一个序列号。 与MyISAM表类似,InnoDB表在行被删除时不重复使用序列号。

在列上设置AUTO_INCREMENT属性后,可以以各种方式,例如使用语句。

整数
主键
PRIMARY KEY
UNIQUE
NOT NULL约束
NULL
INSERT
LAST_INSERT_ID()函数
新行插入到表中
UPDATE
DELETE
存储引擎
重置自动增量值
ALTER TABLE