### 3.6.9 使用自动\_增量

[](<>)[](<>)[](<>)

这`自动递增`属性可用于为新行生成唯一标识：

```
CREATE TABLE animals (
     id MEDIUMINT NOT NULL AUTO_INCREMENT,
     name CHAR(30) NOT NULL,
     PRIMARY KEY (id)
);

INSERT INTO animals (name) VALUES
    ('dog'),('cat'),('penguin'),
    ('lax'),('whale'),('ostrich');

SELECT * FROM animals;
```

返回：

```
+----+---------+
| id | name    |
+----+---------+
|  1 | dog     |
|  2 | cat     |
|  3 | penguin |
|  4 | lax     |
|  5 | whale   |
|  6 | ostrich |
+----+---------+
```

没有为`自动递增`列，因此 MySQL 自动分配序列号。您还可以显式地将 0 分配给列以生成序列号，除非[`NO_AUTO_VALUE_ON_ZERO`](sql-mode.html#sqlmode_no_auto_value_on_zero)SQL 模式已启用。例如：

```
INSERT INTO animals (id,name) VALUES(0,'groundhog');
```

如果声明了列`非空`, 也可以赋值`空值`到列以生成序列号。例如：

```
INSERT INTO animals (id,name) VALUES(NULL,'squirrel');
```

当您将任何其他值插入`自动递增`列，该列设置为该值并重置序列，以便下一个自动生成的值从最大的列值开始顺序跟随。例如：

```
INSERT INTO animals (id,name) VALUES(100,'rabbit');
INSERT INTO animals (id,name) VALUES(NULL,'mouse');
SELECT * FROM animals;
+-----+-----------+
| id  | name      |
+-----+-----------+
|   1 | dog       |
|   2 | cat       |
|   3 | penguin   |
|   4 | lax       |
|   5 | whale     |
|   6 | ostrich   |
|   7 | groundhog |
|   8 | squirrel  |
| 100 | rabbit    |
| 101 | mouse     |
+-----+-----------+
```

更新现有的`自动递增`列值也会重置`自动递增`顺序。

您可以检索最近自动生成的`自动递增`价值观[`最后插入ID（）`](information-functions.html#function_last-insert-id)SQL函数或[`mysql_insert_id（）`](https://dev.mysql.com/doc/c-api/8.0/en/mysql-insert-id.html)C API函数。这些函数是特定于连接的，因此它们的返回值不受另一个也在执行插入的连接的影响。

将最小的整数数据类型用于`自动增量`列的大小足以容纳所需的最大序列值。当列达到数据类型的上限时，下一次生成序列号的尝试失败。使用`未签名`属性，以允许更大的范围。例如，如果你使用[`TINYINT`](integer-types.html)，最大允许序列号为127。对于[`TINYINT未签名`](integer-types.html)，最大值为255。看见[第11.1.2节，“整数类型（精确值）-整数、整数、SMALLINT、TINYINT、MEDIUMINT、BIGINT”](integer-types.html)用于所有整数类型的范围。

笔记

对于多行插入，[`最后插入ID（）`](information-functions.html#function_last-insert-id)和[`mysql_insert_id（）`](https://dev.mysql.com/doc/c-api/8.0/en/mysql-insert-id.html)实际归还`自动增量`钥匙从*第一*插入的行的名称。这样可以在复制设置中的其他服务器上正确复制多行插入。

首先是`自动增量`值而不是1，将该值设置为[`创建表格`](create-table.html)或[`改变桌子`](alter-table.html)，就像这样：

```
mysql> ALTER TABLE tbl AUTO_INCREMENT = 100;
```

#### InnoDB笔记

有关`自动增量`特定于`InnoDB`看见[第15.6.1.6节“自动\_InnoDB中的增量处理”](innodb-auto-increment-handling.html).

#### 米萨姆笔记

-   对于`米萨姆`表，您可以指定`自动增量`在多列索引的第二列上。在本例中，生成的`自动增量`列计算如下：[`麦克斯(*`自动增量列`*)+1，其中前缀=*`给定前缀`*`](aggregate-functions.html#function_max)。当您想将数据放入有序的组中时，这很有用。

    ```
    CREATE TABLE animals (
        grp ENUM('fish','mammal','bird') NOT NULL,
        id MEDIUMINT NOT NULL AUTO_INCREMENT,
        name CHAR(30) NOT NULL,
        PRIMARY KEY (grp,id)
    ) ENGINE=MyISAM;

    INSERT INTO animals (grp,name) VALUES
        ('mammal','dog'),('mammal','cat'),
        ('bird','penguin'),('fish','lax'),('mammal','whale'),
        ('bird','ostrich');

    SELECT * FROM animals ORDER BY grp,id;
    ```

    返回：

    ```
    +--------+----+---------+
    | grp    | id | name    |
    +--------+----+---------+
    | fish   |  1 | lax     |
    | mammal |  1 | dog     |
    | mammal |  2 | cat     |
    | mammal |  3 | whale   |
    | bird   |  1 | penguin |
    | bird   |  2 | ostrich |
    +--------+----+---------+
    ```

    在这种情况下（当`自动增量`列是多列索引的一部分），`自动增量`如果删除具有最大值的行，则会重用值`自动增量`任何一组中的值。这种情况甚至会发生在一个人身上`米萨姆`桌子，哪一张`自动增量`值通常不会被重用。

-   如果`自动增量`列是多个索引的一部分，MySQL使用以`自动增量`列，如果有的话。例如，如果`动物`包含索引的表`主键（grp，id）`和`索引（id）`，MySQL会忽略`主键`用于生成序列值。因此，该表将包含单个序列，而不是每个序列`玻璃钢`价值

#### 进一步阅读

更多关于`自动增量`可从以下网址获取：

-   如何分配`自动增量`列的属性：[第13.1.20节，“创建表语句”](create-table.html)和[第13.1.9节“更改表格声明”](alter-table.html).

-   怎样`自动增量`行为取决于[`零上无自动值`](sql-mode.html#sqlmode_no_auto_value_on_zero)SQL模式：[第5.1.11节，“服务器SQL模式”](sql-mode.html).

-   如何使用[`最后插入ID（）`](information-functions.html#function_last-insert-id)函数来查找包含最近`自动增量`价值：[第12.16节“信息功能”](information-functions.html).

-   设定`自动增量`要使用的值：[第5.1.8节“服务器系统变量”](server-system-variables.html).

-   [第15.6.1.6节“自动\_InnoDB中的增量处理”](innodb-auto-increment-handling.html)

-   `自动增量`和复制：[第17.5.1.1节，“复制和自动\_增量“](replication-features-auto-increment.html).

-   服务器系统变量与`自动增量` ([`自动增量`](replication-options-source.html#sysvar_auto_increment_increment)和[`自动增量偏移`](replication-options-source.html#sysvar_auto_increment_offset))可用于复制的：[第5.1.8节“服务器系统变量”](server-system-variables.html).
