自增列类型¶
神通数据库可指定表的一列(列类型可以为INT BIGINT FLOAT)为自增列,可用于为新行生成唯一标识,并且性能优于序列和 SERIAL。
如果创建表时,没有为该 AUTO_INCREMENT 列指定初始值时,神通数据库会从1开始自动分配序列号; 如果初始建表时指定了自增列的值时, 就以该值作为自增列的起始值。详细语法见 CREATE TABLE 章节
注解
神通仅支持将一个列的属性设置为自增列,且自增列必须有仅包括本列的 PRIMARY KEY 或 UNIQUE 约束。
神通数据库自增列的具体用法如下:
- 在插入数据时,不指定自增列的值,数据库会自动从初值开始递增分配列值
- 支持 INSERT 语句中指定插入的自增列的值
- 如果插入的自增列的值已存在,则会因为唯一性约束而执行报错
- 如果插入的自增列的值不存在,语句执行成功,并且如果该值比当前自增值大,下次从该值往后递增分配
- 支持 ALTER 语句修改相关自增属性,详细语法见 ALTER TABLE 章节
- 列由非自增列改为自增列(表没有自增列的前提下)
- 列由自增列改为非自增列
- 可修改自增列下次分配的值(并且从该值往后递增分配)
- 支持 UPDATE 语句中更新自增列的值
- 如果更新自增列的值已存在,则会因为唯一性约束而执行报错
- 如果更新自增列的值不存在,语句执行成功,并且如果该值比当前自增值大,下次从该值往后递增分配
- 支持 LAST_INSERT_ID 函数来获取本会话上一次插入过的自增列值,详细语法见 LAST_INSERT_ID 函数章节
- 共享存储多主集群环境中支持自增列
- 主节点为每个关系表维护一个全局唯一且递增的自增序列,从节点在本节点内存中维护一个自增范围,从节点只能分配位于此自增范围的自增值,超过自增值范围时需要向主节点申请。
- 系统配置参数 RAC_AUTO_INCR_ATTR_EXTENT 决定了从节点能够一次在本地缓存的局部自增序列数量,默认值为1。
- 当从节点向主节点请求自增值时,主节点根据自身缓存的全局自增值计算出此次分配的局部自增序列起始值,一次性分配连续的 RAC_AUTO_INCR_ATTR_EXTENT 个自增值给从节点。
注解
MySQL 支持的修改自增列的自增步长和偏移量,神通数据库暂不支持
示例1: 使用自增列类型
-- 清理环境
DROP TABLE tab7_1 CASCADE;
DROP TABLE tab7_2 CASCADE;
DROP TABLE tab7_3 CASCADE;
-- 在建表时不指定 AUTO_INCREMENT 的值
CREATE TABLE tab7_1(a INT AUTO_INCREMENT PRIMARY KEY, b VARCHAR(10));
INSERT INTO tab7_1(b) VALUES('111');
INSERT INTO tab7_1(b) VALUES('222');
SELECT * FROM tab7_1;
A(int) |B(varchar) |
----------------------------
1 |111 |
----------------------------
2 |222 |
总数目:2
-- 修改 AUTO_INCREMENT 的起始值
ALTER TABLE tab7_1 AUTO_INCREMENT = 6;
INSERT INTO tab7_1(b) VALUES('333');
INSERT INTO tab7_1(b) VALUES('444');
SELECT * FROM tab7_1;
A(int) |B(varchar) |
----------------------------
1 |111 |
----------------------------
2 |222 |
----------------------------
6 |333 |
----------------------------
7 |444 |
总数目:4
-- 插入数据时设置 AUTO_INCREMENT 的值, 序列将被重置
INSERT INTO tab7_1 VALUES('10','555');
INSERT INTO tab7_1(b) VALUES('666');
SELECT * FROM tab7_1;
A(int) |B(varchar) |
----------------------------
1 |111 |
----------------------------
2 |222 |
----------------------------
6 |333 |
----------------------------
7 |444 |
----------------------------
10 |555 |
----------------------------
11 |666 |
总数目:6
-- 更新现有的 AUTO_INCREMENT 属性列的值为更大值时,序列将被重置
UPDATE tab7_1 SET a = 15 WHERE b ='666';
INSERT INTO tab7_1(b) VALUES('777');
INSERT INTO tab7_1(b) VALUES('888');
SELECT * FROM tab7_1;
A(int) |B(varchar) |
----------------------------
1 |111 |
----------------------------
2 |222 |
----------------------------
6 |333 |
----------------------------
7 |444 |
----------------------------
10 |555 |
----------------------------
15 |666 |
----------------------------
16 |777 |
----------------------------
17 |888 |
总数目:8
-- 更新现有的 AUTO_INCREMENT 属性列的值为小于当前列最大值,序列不会重置
UPDATE tab7_1 SET a = 8 WHERE b = '888';
INSERT INTO tab7_1(b) VALUES('999');
SELECT * FROM tab7_1;
A(int) |B(varchar) |
----------------------------
1 |111 |
----------------------------
2 |222 |
----------------------------
6 |333 |
----------------------------
7 |444 |
----------------------------
10 |555 |
----------------------------
15 |666 |
----------------------------
16 |777 |
----------------------------
8 |888 |
----------------------------
18 |999 |
总数目:9
-- 将 AUTO_INCREMENT 属性列修改为普通列属性
ALTER TABLE tab7_1 MODIFY a VARCHAR(5);
INSERT INTO tab7_1 VALUES('20','555');
SELECT * FROM tab7_1;
A(varchar) |B(varchar) |
--------------------------------
1 |111 |
--------------------------------
2 |222 |
--------------------------------
6 |333 |
--------------------------------
7 |444 |
--------------------------------
10 |555 |
--------------------------------
15 |666 |
--------------------------------
16 |777 |
--------------------------------
8 |888 |
--------------------------------
18 |999 |
--------------------------------
20 |555 |
总数目:10
-- 在建表时指定 AUTO_INCREMENT 的值
CREATE TABLE tab7_2(a INT AUTO_INCREMENT PRIMARY KEY, b VARCHAR(10)) AUTO_INCREMENT = 5;
INSERT INTO tab7_2(b) VALUES('111');
INSERT INTO tab7_2(b) VALUES('222');
SELECT * FROM tab7_2;
A(int) |B(varchar) |
----------------------------
5 |111 |
----------------------------
6 |222 |
总数目:2
-- 创建不包含 AUTO_INCREMENT 属性列的表
CREATE TABLE tab7_3(a INT PRIMARY KEY, b VARCHAR(10));
INSERT INTO tab7_3 VALUES(1,'111');
INSERT INTO tab7_3 VALUES(2,'222');
--将普通列属性修改为 AUTO_INCREMENT 属性列
ALTER TABLE tab7_3 ALTER COLUMN TYPE a INT AUTO_INCREMENT;
INSERT INTO tab7_3(b) VALUES('333');
INSERT INTO tab7_3(b) VALUES('444');
SELECT * FROM tab7_3;
A(int) |B(varchar) |
----------------------------
1 |111 |
----------------------------
2 |222 |
----------------------------
3 |333 |
----------------------------
4 |444 |
总数目:4
-- 清理环境
DROP TABLE tab7_1;
DROP TABLE tab7_2;
DROP TABLE tab7_3;