在DM 数据库中,自增有两种方法实现,一种是自增列,另一种通过序列实现。
1 自增列
1.1 创建自增列
在创建表时可以制定列是否自增。 一个表只能有一个自增列。
语法格式/cndba/dave/article/3590
IDENTITY [ (种子, 增量) ]
/cndba/dave/article/3590
参数
1.种子:装载到表中的第一个行所使用的值;
2.增量:增量值,该值被添加到前一个已装载的行的标识值上。增量值可以为正数或负数,但不能为 0。
1.IDENTITY 适用于 int(-2147483648~+2147483647)、bigint(-2^63~+2^63-2)类型的列;每个表只能创建一个自增列;
2.不能对自增列使用 DEFAULT 约束;
3.必须同时指定种子和增量值,或者二者都不指定。如果二者都未指定,则取默认值(1,1);若种子或增量为小数类型,报错;
4.最大值和最小值为该列的数据类型的边界;
5.建表种子和增量大于最大值或者种子和增量小于最小值时报错;
6.自增列一旦生成,无法更新,不允许用 Update 语句进行修改;/cndba/dave/article/3590
临时表、列存储表、水平分区表、垂直分区表不支持使用自增列。
SQL> create table HuaiNing(id int identity,name varchar(20));
executed successfully
used time: 6.902(ms). Execute id is 551.
SQL>
SQL> desc huaining
LINEID NAME TYPE$ NULLABLE
---------- ---- ----------- --------
1 ID INTEGER N
2 NAME VARCHAR(20) Y
used time: 12.016(ms). Execute id is 552.
SQL>
1.2 自增列查询函数
1)IDENT_SEED (‘tablename’) : 返回种子值,该值是在带有自增列的表中创建自增列时指定的。
SQL> select ident_seed('CNDBA.HUAINING');
LINEID IDENT_SEED('CNDBA.HUAINING')
---------- ----------------------------
1 1
used time: 2.280(ms). Execute id is 553.
SQL>
2)IDENT_INCR (‘tablename’):返回增量值,该值是在带有自增列的表中创建自增列时指定的。
SQL> select ident_incr('CNDBA.HUAINING');
LINEID IDENT_INCR('CNDBA.HUAINING')
---------- ----------------------------
1 1
used time: 2.114(ms). Execute id is 555.
SQL>
3)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 表是完全一样的。如果插入时,既不指定自增列名也不给自增列赋值,则新插入行中自增列的当前值由系统自动生成。
#插入时没有制定id的值:
SQL> insert into huaining values('dave');
affect rows 1
used time: 2.114(ms). Execute id is 557.
SQL> insert into huaining values('cndba');
affect rows 1
SQL> select * from huaining;
LINEID ID NAME
---------- ----------- -----
1 1 dave
2 2 cndba
used time: 1.177(ms). Execute id is 562.
SQL>
#将 IDENTITY_INSERT 设置为 ON,然后显示的指定id的值:
SQL> set identity_insert cndba.huaining on;
executed successfully
used time: 1.226(ms). Execute id is 568.
#注意这里,简写不行:
SQL> insert into huaining values(4,'hefei');
insert into huaining values(4,'hefei');
[-2723]:Error in line: 1
Only if specified in the column list and SET IDENTITY_INSERT is ON, then identity column could be assigned value.
used time: 0.862(ms). Execute id is 0.
SQL> insert into huaining(id,name) values(4,'hefei');
affect rows 1
used time: 1.846(ms). Execute id is 569.
SQL> commit;
executed successfully
used time: 10.203(ms). Execute id is 570.
SQL> select * from huaining;
LINEID ID NAME
---------- ----------- -----
1 1 dave
2 2 cndba
3 4 hefei
used time: 0.643(ms). Execute id is 571.
SQL>
SQL> update huaining set id=3 where name='hefei';
update huaining set id=3 where name='hefei';
[-2664]:Error in line: 1
Try to alter identity column [ID].
used time: 1.558(ms). Execute id is 0.
SQL>
5) 还原 IDENTITY_INSERT 属性。
SQL> set identity_insert cndba.huaining off;
executed successfully
used time: 1.489(ms). Execute id is 572.
6) 插入后再次查询。
SQL> insert into huaining values('anqing');
affect rows 1
used time: 2.026(ms). Execute id is 573.
SQL> commit;
executed successfully
used time: 10.943(ms). Execute id is 574.
#注意这里的id值是从5开始的:
SQL> select * from huaining;
LINEID ID NAME
---------- ----------- ------
1 1 dave
2 2 cndba
3 4 hefei
4 5 anqing
used time: 1.757(ms). Execute id is 575.
SQL>
2 序列
序列是一个数据库实体,通过它多个用户可以产生唯一整数值,可以用序列来自动地生成主关键字值。
2.1 创建序列
语法格式:
CREATE SEQUENCE [ .] [ ];
::= {}
::=
INCREMENT BY |
START WITH |
MAXVALUE |
NOMAXVALUE|
MINVALUE |
NOMINVALUE|
CYCLE|
NOCYCLE|
CACHE |
NOCACHE|
ORDER |
NOORDER |
GLOBAL |
LOCAL
参数
指明被创建的序列属于哪个模式,缺省为当前模式;
指明被创建的序列的名称,序列名称最大长度128字节;
指定序列数之间的间隔,这个值可以是[-1000000, 1000000]之间任意的DM正整数或负整数,但不能为0。如果此值为负,序列是下降的,如果此值为正,序列是上升的。如果忽略INCREMENT BY子句,则间隔缺省为1。增量值的绝对值必须小于( - );
指定被生成的第一个序列数,可以用这个选项来从比最小值大的一个值开始升序序列或比最大值小的一个值开始降序序列。对于升序序列,缺省值为序列的最小值,对于降序序列,缺省值为序列的最大值;
指定序列能生成的最大值,如果忽略MAXVALUE子句,则降序序列的最大值缺省为 -1 ,升序序列的最大值 缺 省 为9223372036854775807(0x7FFFFFFFFFFFFFFF),若指定的最大值超出缺省最大值,则DM自动将最大值置为缺省最大值。非循环序列在到达最大值之后,将不能继续生成序列数;
指定序列能生成的最小值,如果忽略MINVALUE子句,则升序序列的最小值缺省为 1 ,降序序列的最小值 缺 省 为 -9223372036854775808(0x8000000000000000),若指定的最小值超出缺省最小值,则DM自动将最小值置为缺省最小值。循环序列在到达最小值之后,将不能继续生成序列数。最小值必须小于最大值;
CYCLE 该关键字指定序列为循环序列:当序列的值达到最大值/最小值时,序列将从最小值/最大值计数;
NOCYCLE 该关键字指定序列为非循环序列:当序列的值达到最大值/最小值时,序列将不再产生新值;
CACHE 该关键字表示序列的值是预先分配,并保持在内存中,以便更快地访问;指定预先分配的值的个数,最小值为2;最大值为50000;且缓存值不能大于( - )/;
NOCACHE 该关键字表示序列的值是不预先分配;
ORDER 该关键字表示以保证请求顺序生成序列号;
NOORDER 该关键字表示不保证请求顺序生成序列号;
GLOBAL 该关键字表示MPP环境下序列为全局序列,缺省为GLOBAL;
LOCAL 改关键字表示MPP环境下序列为本地序列。
SQL> create table anqing(id int);
executed successfully
used time: 5.814(ms). Execute id is 576.
SQL> create sequence seq_id increment by 10;
executed successfully
used time: 4.758(ms). Execute id is 577.
SQL>
#插入序列值:
SQL> create sequence seq_id increment by 10;
executed successfully
used time: 4.758(ms). Execute id is 577.
SQL> insert into anqing(seq_id.nextval);
insert into anqing(seq_id.nextval);
insert into anqing(seq_id.nextval);
*
line 1, column 34, nearby [;] has error[-]:
Syntax error.
used time: 1.101(ms). Execute id is 0.
SQL>
SQL> insert into anqing(id) values(seq_id.nextval);
affect rows 1
used time: 2.996(ms). Execute id is 578.
SQL> select * from anqing;
LINEID ID
---------- -----------
1 1
used time: 2.227(ms). Execute id is 579.
SQL>
2.2 序列修改语句
DM 系统提供序列修改语句,包括修改序列步长值、设置序列最大值和最小值、改变序列的缓存值、循环属性、ORDER 属性。
语法格式
ALTER SEQUENCE [ .] [ ];
::= {}
::=
INCREMENT BY |
MAXVALUE |
NOMAXVALUE|
MINVALUE |
NOMINVALUE|
CYCLE|
NOCYCLE|
CACHE |
NOCACHE|
ORDER|
NOORDER/cndba/dave/article/3590
#创建完序列后直接修改序列的步长。
SQL> CREATE SEQUENCE SEQ1 INCREMENT BY 1000 START WITH 5 NOMAXVALUE NOMINVALUE CACHE 10;
executed successfully
used time: 7.370(ms). Execute id is 580.
SQL> ALTER SEQUENCE SEQ1 INCREMENT BY 1 ;
executed successfully
used time: 13.188(ms). Execute id is 581.
SQL> SELECT SEQ1.NEXTVAL FROM DUAL;
LINEID NEXTVAL
---------- --------------------
1 -994
used time: 1.474(ms). Execute id is 582.
SQL>
#创建序列后使用NEXTVAL访问了序列,然后修改步长。
SQL> CREATE SEQUENCE SEQ2 INCREMENT BY 1000 START WITH 5 NOMAXVALUE NOMINVALUE NOCACHE ;
executed successfully
used time: 10.377(ms). Execute id is 583.
SQL> SELECT SEQ2.NEXTVAL FROM DUAL;
LINEID NEXTVAL
---------- --------------------
1 5
used time: 1.350(ms). Execute id is 584.
SQL> ALTER SEQUENCE SEQ2 INCREMENT BY 1 ;
executed successfully
used time: 5.307(ms). Execute id is 585.
SQL> SELECT SEQ2.NEXTVAL FROM DUAL;
LINEID NEXTVAL
---------- --------------------
1 6
used time: 2.130(ms). Execute id is 586.
SQL>
#例3 修改序列的最小值。
SQL> CREATE SEQUENCE SEQ3 INCREMENT BY 1 START WITH 100 MINVALUE 3 ;
executed successfully
used time: 4.964(ms). Execute id is 587.
SQL> ALTER SEQUENCE SEQ3 MINVALUE 2;
executed successfully
used time: 5.278(ms). Execute id is 588.
SQL>
2.3 序列删除语句
DM 系统允许用户在建立序列后还可随时删除序列。
语法格式:
DROP SEQUENCE [ .];/cndba/dave/article/3590/cndba/dave/article/3590
SQL> drop sequence seq3;
executed successfully
used time: 14.809(ms). Execute id is 589.
SQL>
版权声明:本文为博主原创文章,未经博主允许。