---
title: "定义自增列 | OceanBase 文档中心"
description: 定义自增列 如果创建表时需要某个数值列的值不重复并且保持递增，这就是自增列。列的类型可以定义为 AUTO_INCREMENT，即 MySQL 租户的自增列。 描述 自增列有三个重要属性，包括自增起始值、自增步长和自增列缓存个数，通过以下三个租户变量参数来控制。 系统变量 说明 auto_increment_offse…
image: https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*OSPzQ6GUQF4AAAAAQHAAAAgAeiGDAQ/original
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 3.2.3 企业版 LTS

# 定义自增列

更新时间：2023-07-18 17:26:00

如果创建表时需要某个数值列的值不重复并且保持递增，这就是自增列。列的类型可以定义为 AUTO_INCREMENT，即 MySQL 租户的自增列。

## 描述

自增列有三个重要属性，包括自增起始值、自增步长和自增列缓存个数，通过以下三个租户变量参数来控制。

| 系统变量 | 说明 |
| --- | --- |
| auto_increment_offset | 用于确定 `AUTO_INCREMENT` 列值的起始值，取值范围为 [1, 65535]，默认值为 `1`。 |
| auto_increment_increment | 用于设置自增步长，取值范围为 [1, 65535]，默认值为 `1`。 |
| auto_increment_cache_size | 用于设置自增的缓存个数，取值范围为 [1, 100000000]，默认值为 `1000000`。 |

## 示例

下面创建了一个自增列，在使用 `INSERT` 语句插入记录时不需要指定自增列，OceanBase 数据库会自动为该列填充值。

如果在 `INSERT` 时指定了自增列的值，且`SQL_MODE` 没有设置 `NO_AUTO_VALUE_ON_ZERO` ，如果这个值为 `0`，则 OceanBase 数据库会用自增列的下一个值填充列的值；如果这个值比当前最大值小，则不影响自增列的下一个值的计算；如果这个值比当前值最大值大，则自增列会把插入值和自增列缓存值的和作为下次自增的起始值。

> **说明**
>
>  
>
> 如果 SQL_MODE 设置为 NO_AUTO_VALUE_ON_ZERO ，则表示不要在列中的 INSERT 为零时生成 AUTO_INCREMENT。

### 创建 t1 表并指定列约束条件

示例如下：

```sql
obclient> CREATE TABLE t1(id bigint not null auto_increment primary key, name varchar(50), gmt_create timestamp not null default current_timestamp);
Query OK, 0 rows affected

obclient> INSERT INTO t1(name) VALUES('A'),('B'),('C');
Query OK, 3 rows affected
Records: 3  Duplicates: 0  Warnings: 0

obclient> SELECT * FROM t1;
+----+------+---------------------+
| id | name | gmt_create          |
+----+------+---------------------+
|  1 | A    | 2020-04-03 17:09:55 |
|  2 | B    | 2020-04-03 17:09:55 |
|  3 | C    | 2020-04-03 17:09:55 |
+----+------+---------------------+
3 rows in set

```

- 指定 `id` 列数字类型为 `bigint`。
 - 非空约束（`NOT NULL`）：不允许约束包含的列的值为 `NULL`。
 - 设置自增列：`auto_increment`。
 - `primary key`：设置 id 列为主键列。
 - `name varchar(50)`：允许 name 列插入的数据类型为字符型（varchar），`50` 表示最大字符长度。
 - 由于设置了 `id` 列为自增列，所以在使用 `INSERT` 语句插入记录时不需要指定自增列，OceanBase 数据库会自动为该列填充值。

### 在 t1 表中插入一条数据且指定自增列的值为 0

示例如下：

```sql
obclient> INSERT INTO t1(id, name) VALUES(0, 'D');
Query OK, 1 row affected

obclient> SELECT * FROM t1;
+----+------+---------------------+
| id | name | gmt_create          |
+----+------+---------------------+
|  1 | A    | 2021-12-17 14:21:53 |
|  2 | B    | 2021-12-17 14:21:53 |
|  3 | C    | 2021-12-17 14:21:53 |
|  4 | D    | 2021-12-17 14:22:36 |
+----+------+---------------------+

```

根据示例可知，在 `INSERT` 时指定了自增列的值，且这个值为 `0`，则 OceanBase 数据库会用自增列的下一个值填充列的值。

### 在 t1 表中插入一条数据并指定自增列的值为 -1

示例如下：

```sql
obclient> INSERT INTO t1(id, name) VALUES(-1,'E');
Query OK, 1 row affected

obclient> SELECT * FROM t1;
+----+------+---------------------+
| id | name | gmt_create          |
+----+------+---------------------+
| -1 | E    | 2021-12-17 15:25:04 |
|  1 | A    | 2021-12-17 14:21:53 |
|  2 | B    | 2021-12-17 14:21:53 |
|  3 | C    | 2021-12-17 14:21:53 |
|  4 | D    | 2021-12-17 14:22:36 |
+----+------+---------------------+
5 rows in set

```

- 因为 `-1` 比当前自增列的最大值小，所以不影响自增列的下一个值的计算。

### 在 t1 表中插入一条数据并指定自增列的值为 10

示例如下：

```sql
obclient> INSERT INTO t1(id, name) VALUES(10,'F');
Query OK, 1 row affected

obclient> SELECT * FROM t1;
+----+------+---------------------+
| id | name | gmt_create          |
+----+------+---------------------+
| -1 | E    | 2021-12-17 15:25:04 |
|  1 | A    | 2021-12-17 14:21:53 |
|  2 | B    | 2021-12-17 14:21:53 |
|  3 | C    | 2021-12-17 14:21:53 |
|  4 | D    | 2021-12-17 14:22:36 |
| 10 | F    | 2021-12-17 15:33:28 |
+----+------+---------------------+
6 rows in set

```

因为 `10` 比当前自增列的最大值大，所以此时不指定自增列的值，在 `name` 列插入一条数据 `G` ,则自增列会把插入值 （10）和自增列缓存值（1000000）的和作为下次自增的起始值（1000011）。

查询结果如下：

```sql
obclient> INSERT INTO t1(name) VALUES('G');
Query OK, 1 row affected

obclient> SELECT * FROM t1;
+---------+------+---------------------+
| id      | name | gmt_create          |
+---------+------+---------------------+
|      -1 | E    | 2020-04-03 17:10:24 |
|       1 | A    | 2020-04-03 17:09:55 |
|       2 | B    | 2020-04-03 17:09:55 |
|       3 | C    | 2020-04-03 17:09:55 |
|       4 | D    | 2020-04-03 17:10:19 |
|      10 | F    | 2020-04-03 17:10:29 |
| 1000011 | G    | 2020-04-03 17:10:34 |
+---------+------+---------------------+
7 rows in set

```

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
