MySQL AUTO_INCREMENT 示例

什么是自动递增?

自动递增是一个对数字数据类型进行操作的函数。每当向表中插入一条记录时,它会自动为定义为自动递增的字段生成顺序数字值。

何时使用自动递增?

在数据库规范化课程中,我们学习了如何通过将数据存储在许多小表中,并使用主键和外键将它们相互关联,来将数据存储到最小化冗余。

MySQL AUTO_INCREMENT with Examples

主键必须是唯一的,因为它能唯一地标识数据库中的一行。但是,我们如何确保主键始终是唯一的呢?一种可能的解决方案是使用一个公式来生成主键,该公式在添加数据之前会检查主键在表中的存在性。这可能效果不错,但正如您所见,这种方法复杂且并非万无一失。为了避免这种复杂性并确保主键始终是唯一的,我们可以使用 MySQL 的自动递增功能来生成主键。自动递增与 INT 数据类型一起使用。INT 数据类型同时支持有符号和无符号值。无符号数据类型只能包含正数。最佳实践建议在自动递增主键上定义无符号约束。

自动递增语法

现在我们来看用于创建 movie categories 表的脚本。

CREATE TABLE `categories` (
  `category_id` int(11) AUTO_INCREMENT,
  `category_name` varchar(150) DEFAULT NULL,
  `remarks` varchar(500) DEFAULT NULL,
  PRIMARY KEY (`category_id`)
);

注意 `category_id` 字段上的“AUTO_INCREMENT”。这会使 `category_id` 在每次向表中插入新行时自动生成。在向表中插入数据时,不会提供此字段,MySQL 会生成它。

默认情况下,AUTO_INCREMENT 的起始值为 1,并且每条新记录会递增 1。

让我们检查 categories 表的当前内容。

SELECT * FROM `categories`;

在 MySQL Workbench 中针对 myflixdb 执行上述脚本会得到以下结果。

category_id category_name remarks
1 Comedy Movies with humour
2 Romantic Love stories
3 Epic Story acient movies
4 Horror NULL
5 Science Fiction NULL
6 Thriller NULL
7 Action NULL
8 Romantic Comedy NULL

现在向 categories 表中插入一个新的类别。

INSERT INTO  `categories` (`category_name`) VALUES ('Cartoons');

MySQL workbench 中针对 myflixdb 执行上述脚本,会得到如下结果。

category_id category_name remarks
1 Comedy Movies with humour
2 Romantic Love stories
3 Epic Story acient movies
4 Horror NULL
5 Science Fiction NULL
6 Thriller NULL
7 Action NULL
8 Romantic Comedy NULL
9 Cartoons NULL

请注意,我们没有提供 `category_id`。MySQL 自动为我们生成了它,因为 `category_id` 被定义为自动递增。

如果您想获取 MySQL 生成的最后一个插入 ID,可以使用 `LAST_INSERT_ID` 函数来实现。下面显示的脚本可以获取生成的最后一个 ID。

SELECT LAST_INSERT_ID();

执行上述脚本会返回 INSERT 查询生成的最后一个自动递增编号。结果如下所示。

MySQL AUTO_INCREMENT

摘要

  • 当自动递增属性指定在具有数字数据类型的列上时,每当向数据库添加新行时,它都会按顺序生成数字。
  • 自动递增通常用于生成主键。
  • 指定的自动递增数据类型应足够大,以便容纳大量记录。将 TINYINT 定义为自动递增字段的数据类型会将可添加到表的记录数量限制为仅 255 条,因为 TINYINT 数据类型将不接受超出该值的值。
  • 指定自动递增主键上的无符号约束以避免出现负数被认为是最佳实践。
  • 当从表中删除一行时,其自动递增 ID 不会被重复使用。MySQL 会继续按顺序生成新编号。
  • 默认情况下,AUTO_INCREMENT 的起始值为 1,并且每条新记录会递增 1。
  • 要让 AUTO_INCREMENT 序列从另一个值开始,请使用 AUTO_INCREMENT = 10