第 15 章 生成和使用序列 生成和使用序列
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
15.0 引言
序列是根据的要求按顺序生成的一组整数(1、2、3......)。序列在数据库中使用频繁,因为许多应用程序要求表中的每一行都包含唯一值,而序列提供了生成唯一值的简便方法。本章将介绍如何通过以下五种方式在 MySQL 中使用序列:
- 使用
AUTO_INCREMENT列 AUTO_INCREMENT列是 MySQL 在一组行上生成序列的机制。每次在包含AUTO_INCREMENT列的表中创建一条记录时,MySQL 都会自动生成序列中的下一个值作为该列的值。该值可作为唯一标识符,使序列成为创建客户 ID 编号、运输包装运单编号、发票或采购订单编号、错误报告 ID、票据编号或产品序列号等项目的简便方法。- 检索序列值
对于许多应用程序来说,仅仅创建序列值是不够的。还需要为刚插入的记录确定序列值。网络应用程序可能需要向用户重新显示根据用户刚刚提交的表单内容创建的行的内容。可能需要检索该值,以便将其存储到相关表的行中。
- 重测序技术
可以对因行列删除而出现漏洞的序列重新编号,重新使用序列顶部已删除的值,或在没有序列列的表中添加序列列。
- 管理多个同步序列
如果需要跟踪多个序列值,例如在多个表中创建行,而每个表都有一个
AUTO_INCREMENT列,则需要特别注意。- 使用单行序列发生器
序列可以用作计数器。例如,要计算投票中的票数,可以在候选人每次得票时递增计数器。给定候选人的计数会形成一个序列,但由于计数本身是唯一值得关注的值,因此不需要生成一条新记录来记录每次投票。MySQL 利用一种机制为这一问题提供了解决方案,这种机制可以在单个表行中随着时间的推移轻松生成序列。要在表中存储多个计数器,可使用一列来唯一标识每个计数器。同样的机制还可以创建以 1 以外的值或非均匀值递增的序列。
大多数数据库系统的引擎都提供序列生成功能,不过实现方式往往取决于引擎。MySQL 也是如此,因此本节的内容几乎完全是针对 MySQL 的,甚至在 SQL 层面也是如此。换句话说,用于生成序列的 SQL 本身是不可移植的,即使你使用的 API(如 DBI 或 JDBC)提供了一个抽象层。抽象接口可以帮助你可移植地处理 SQL 语句,但它们并不能使不可移植的 SQL 可移植。
与本章示例相关的脚本位于 recipes 发行版的sequences目录中。有关创建此处所用表格的脚本,请查看tables目录。
15.1 使用 AUTO_INCREMENT 列生成序列
问题
您的表中有一列只包含唯一 ID,您需要在这一列中插入值,确保它们是序列的一部分。
解决方案
使用AUTO_INCREMENT 栏生成序列。
讨论
本食谱提供了使用AUTO_INCREMENT 列的基本背景知识,并从一个演示序列生成机制的示例开始。该示例围绕一个收集昆虫的场景展开:您八岁的儿子 Junior 被指派为学校的课堂项目收集昆虫。对于每只昆虫,小詹姆斯都要记录下它的名字(蚂蚁、
蜜蜂
等)、采集日期和地点。从 Junior 小时候起,你就向他阐述了 MySQL 在保存记录方面的优势,所以那天你下班回家后,他立即宣布有必要完成这个项目,然后直视着你的眼睛,宣称这显然是一个 MySQL 非常适合的任务。你有什么资格反驳呢?于是,你们俩开始工作。在等你回家的时候,小詹姆斯已经在放学后收集了一些标本,并在笔记本上记录了以下信息:
| 名称 | 日期 | 起源 |
|---|---|---|
| 蠲 | 2014-09-10 | 车道 |
| 苍蝇 | 2014-09-10 | 厨房 |
| 蚱蜢 |
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access