达梦数据库自增列的实现

   在DM 数据库中,自增有两种方法实现,一种是自增列,另一种通过序列实现。

方式一 IDENTITY自增

在创建表时可以制定列是否自增。 一个表只能有一个自增列。

语法格式

IDENTITY [ (种子, 增量) ]

参数

1.种子:装载到表中的第一个行所使用的值;
2.增量:增量值,该值被添加到前一个已装载的行的标识值上。增量值可以为正数或负数,但不能为 0。

使用说明

1.IDENTITY 适用于 int(-2147483648~+2147483647)、bigint(-2^63~+2^63-2)类型的列;每个表只能创建一个自增列;
2.不能对自增列使用 DEFAULT 约束;
3.必须同时指定种子和增量值,或者二者都不指定。如果二者都未指定,则取默认值(1,1);若种子或增量为小数类型,报错;
4.最大值和最小值为该列的数据类型的边界;
5.建表种子和增量大于最大值或者种子和增量小于最小值时报错;
6.自增列一旦生成,无法更新,不允许用 Update 语句进行修改;

1)临时表、列存储表、水平分区表、垂直分区表不支持使用自增列。

create table TEST1(id int identity,name varchar(20));
insert into TEST1(name) values('张三');
insert into TEST1(name) values('李四');
commit;
select * from TEST1;

2)SET IDENTITY_INSERT 属性: 设置是否允许将显式值插入表的自增列中。


语法格式:

SET IDENTITY_INSERT [<模式名>.]<表名> ON | OFF;

使用说明

1.IDENTITY_INSERT 属性的默认值为 OFF。SET IDENTITY_INSERT 的设置是在执行或运行时进行的。当一个连接结束,IDENTITY_INSERT 属性将被自动还原为 OFF;
2.DM 要求一个会话连接中只有一个表的 IDENTITY_INSERT 属性可以设置为 ON,当设置一个新的表 IDENTITY_INSERT 属性设置为 ON 时,之前已经设置为 ON 的表会自动还原为 OFF。当一个表的 IDENTITY_INSERT 属性被设置为 ON 时,该表中的自动增量列的值由用户指定。如果插入值大于表的当前标识值(自增列当前值),则 DM 自动将新插入值作为当前标识值使用,即改变该表的自增列当前值;否则,将不影响该自增列当前值;
3.当设置一个表的 IDENTITY_INSERT 属性为 OFF 时,新插入行中自增列的当前值由系统自动生成,用户将无法指定;
4.自增列一经插入,无法修改;
5.手动插入自增列,除了将 IDENTITY_INSERT 设置为 ON,还要求在插入列表中明确指定待插入的自增列列名。插入方式与非 IDENTITY 表是完全一样的。如果插入时,既不指定自增列名也不给自增列赋值,则新插入行中自增列的当前值由系统自动生成。

set identity_insert SYSDBA.TEST1 on;
insert into TEST1 values(5,'王五');  
--此处不能简写
insert into TEST1(id,name) values(5,'王五');
select * from TEST1;

方式二 序列

序列是一个数据库实体,通过它多个用户可以产生唯一整数值,可以用序列来自动地生成主关键字值。

语法格式:

CREATE SEQUENCE [ <模式名>.] <序列名> [ <序列选项列表>];
<序列选项列表> ::= <序列选项>{<序列选项>}
<序列选项> ::=
INCREMENT BY <增量值>|
START WITH <初值>|
MAXVALUE <最大值>|
NOMAXVALUE|
MINVALUE <最小值>|
NOMINVALUE|
CYCLE|
NOCYCLE|
CACHE <缓存值>|
NOCACHE|
ORDER |
NOORDER |
GLOBAL |
LOCAL

参数

  1. <模式名> 指明被创建的序列属于哪个模式,缺省为当前模式;
  2. <序列名> 指明被创建的序列的名称,序列名称最大长度128字节;
  3. <增量值> 指定序列数之间的间隔,这个值可以是[-1000000, 1000000]之间任意的DM正整数或负整数,但不能为0。如果此值为负,序列是下降的,如果此值为正,序列是上升的。如果忽略INCREMENT BY子句,则间隔缺省为1。增量值的绝对值必须小于(<最大值> - <最小值>);
  4. <初值> 指定被生成的第一个序列数,可以用这个选项来从比最小值大的一个值开始升序序列或比最大值小的一个值开始降序序列。对于升序序列,缺省值为序列的最小值,对于降序序列,缺省值为序列的最大值;
  5. <最大值> 指定序列能生成的最大值,如果忽略MAXVALUE子句,则降序序列的最大值缺省为 -1 ,升序序列的最大值 缺 省 为9223372036854775807(0x7FFFFFFFFFFFFFFF),若指定的最大值超出缺省最大值,则DM自动将最大值置为缺省最大值。非循环序列在到达最大值之后,将不能继续生成序列数;
  6. <最小值> 指定序列能生成的最小值,如果忽略MINVALUE子句,则升序序列的最小值缺省为 1 ,降序序列的最小值 缺 省 为 -9223372036854775808(0x8000000000000000),若指定的最小值超出缺省最小值,则DM自动将最小值置为缺省最小值。循环序列在到达最小值之后,将不能继续生成序列数。最小值必须小于最大值;
  7. CYCLE 该关键字指定序列为循环序列:当序列的值达到最大值/最小值时,序列将从最小值/最大值计数;
  8. NOCYCLE 该关键字指定序列为非循环序列:当序列的值达到最大值/最小值时,序列将不再产生新值;
  9. CACHE 该关键字表示序列的值是预先分配,并保持在内存中,以便更快地访问;<缓存值>指定预先分配的值的个数,最小值为2;最大值为50000;且缓存值不能大于(<最大值> - <最小值>)/<增量值>;
  10. NOCACHE 该关键字表示序列的值是不预先分配;
  11. ORDER 该关键字表示以保证请求顺序生成序列号;
  12. NOORDER 该关键字表示不保证请求顺序生成序列号;
  13. GLOBAL 该关键字表示MPP环境下序列为全局序列,缺省为GLOBAL;
  14. LOCAL 改关键字表示MPP环境下序列为本地序列。

create table sequ(id int);
create sequence seq_id increment by 6;  --创建序列
insert into sequ values(seq_id.nextval);
insert into sequ values(seq_id.nextval);
commit;
select * from sequ;

通过序列实现自增方式

create sequence seq_id1 increment by 1;            --创建序列 自增列为1
create table sequ1(id number default seq_id1.nextval ,          --将序列作为默认值,可以实现自增效果
name varchar2(20));
insert into sequ1(name) values('张三');
insert into sequ1(name) values('李四');
commit;

select * from sequ1;

在达梦DM8_2023年5月后新增兼容自增列auto_increment语法

默认等价于identity(1,1)情况

更多达梦相关材料可以参考达梦数据库官方适配中心达梦数据库 - 新一代大型通用关系型数据库 | 达梦在线服务平台

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐