基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
定义自增列
更新时间: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 表并指定列约束条件
示例如下:
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
示例如下:
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
示例如下:
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
示例如下:
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)。
查询结果如下:
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