自增列
说明
使用此子句指定自增列。对于每个后续的INSERT语句,将从序列生成器中为标识列分配一个递增或递减整数值。可以使用identity_options子句配置序列生成器。
- ALWAYS
如果指定ALWAYS,则数据库始终使用序列生成器为列分配值。如果尝试使用INSERT或UPDATE显式地为列赋值,则将返回错误。这是默认设置。
- BY DEFAULT
如果指定BY DEFAULT,则默认情况下,数据库会使用序列生成器为列分配值,但也可以显式为列分配指定的值。如果指定ON NULL,则当后续INSERT语句尝试分配计算结果为NULL的值时,数据库会使用序列生成器为该列分配值。
- identity_options
使用identity_options子句配置序列生成器。例外是START WITH LIMIT VALUE,它特定于identity_options,只能与ALTER TABLE MODIFY一起使用。
示例
新建自增列
说明:
创建一个带有自增列的表,并进行插入数据。
CREATE TABLE identity_col (
id number GENERATED ALWAYS AS IDENTITY start WITH 10 INCREMENT by 1,
description VARCHAR2(30)
);
INSERT INTO identity_col (description)VALUES(‘one DESCRIPTION’);
INSERT INTO identity_col (description)VALUES(‘second DESCRIPTION’);
ALWAYS选项
说明:
- GENERATED ALWAYS AS IDENTITY 可以不指定该列进行插入
- GENERATED ALWAYS AS IDENTITY不能在该列中插入NULL值
- GENERATED ALWAYS AS IDENTITY不能指定具体值插入
- GENERATED ALWAYS AS IDENTITY 不能使用update更新该列
CREATE TABLE identity_aways (
id NUMBER GENERATED ALWAYS AS IDENTITY,
description VARCHAR2(30)
);
INSERT INTO identity_aways (description) VALUES (‘Just DESCRIPTION’);
BY DEFAULT选项
说明:
- GENERATED BY DEFAULT AS IDENTITY 可以不指定该列进行插入
- GENERATED BY DEFAULT AS IDENTITY 可以指定具体值插入
- GENERATED BY DEFAULT AS IDENTITY 不能在该列中插入null值
- 可以使用update更新该列,但不能更新为NULL
--by default选项
CREATE TABLE identity_default (
id NUMBER GENERATED BY DEFAULT AS IDENTITY,
description VARCHAR2(30)
);
INSERT INTO identity_default (description) VALUES (‘Just DESCRIPTION’);–ok
INSERT INTO identity_default (id, description) VALUES (999, ‘ID=999 and DESCRIPTION’);
DEFAULT ON NULL选项
说明:
- GENERATED BY DEFAULT ON NULL AS IDENTITY 可以不指定该列进行插入
- GENERATED BY DEFAULT ON NULL AS IDENTITY 可以指定具体值插入
- GENERATED BY DEFAULT ON NULL AS IDENTITY 可以在该列中插入null值
- 可以使用update更新该列,但不能更新为NULL
--default on null选项
CREATE TABLE identity_default_null (
id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,
description VARCHAR2(30)
);
INSERT INTO identity_default_null (description) VALUES (‘Just DESCRIPTION’);
INSERT INTO identity_default_null (id, description) VALUES (999, ‘ID=999 and DESCRIPTION’);
INSERT INTO identity_default_null (id, description) VALUES (NULL, ‘ID=NULL and DESCRIPTION’);
UPDATE identity_default_null SET ID=3 WHERE ID=1;
IDENTITY_OPTIONS
不指定任何选项时
将创建一个从1开始并以1递增且没有上限的升序序列,仅指定INCREMENT BY -1会创建一个以-1开头并没有下限递减的降序序列
代码示例:
CREATE TABLE identity_2(
id number GENERATED BY DEFAULT AS IDENTITY,
description VARCHAR2(30)
);
INSERT INTO identity_2 (description) VALUES (‘one DESCRIPTION’);
select * from identity_2;
ID | DESCRIPTION
1 one DESCRIPTION
INCREMENT BY
用于定义序列步长,如果忽略,则默认为-1,如果出现负值,则代表序列的值是按照此步长递减的,该值的绝对值必须小于MAXVALUE和MINVALUE的差值。
代码示例:
CREATE TABLE identity_3(
id number GENERATED BY DEFAULT AS IDENTITY INCREMENT by 2,
description VARCHAR2(30)
);
INSERT INTO identity_3 (description) VALUES (‘one DESCRIPTION’);
INSERT INTO identity_3 (description) VALUES (‘second DESCRIPTION’);
select * from identity_3;
ID | DESCRIPTION
1 one DESCRIPTION
3 second DESCRIPTION
START WITH
指定生成序列的第一个值,对于升序序列,默认值是序列的最小值。对于降序序列,默认值为序列的最大值
代码示例:
CREATE TABLE identity_4(
id number GENERATED BY DEFAULT AS IDENTITY INCREMENT by 2 START WITH 10,
description VARCHAR2(30)
);
INSERT INTO identity_4 (description) VALUES (‘one DESCRIPTION’);
INSERT INTO identity_4 (description) VALUES (‘second DESCRIPTION’);
select * from identity_4;
ID | DESCRIPTION
10 one DESCRIPTION
12 second DESCRIPTION
MAXVALUE/NOMAXVALUE
指定序列可以生成的最大值。默认为NOMAXVALUE,代表没有最大值定义。这个整数值为bigint的最大值(指定插入值不受MAXVALUE限制)
代码示例:
CREATE TABLE identity_5(
id int GENERATED BY DEFAULT AS IDENTITY INCREMENT by 2 START WITH 10 MAXVALUE 15,
description VARCHAR2(30)
);
INSERT INTO identity_5 (description) VALUES (‘one DESCRIPTION’);
INSERT INTO identity_5 (description) VALUES (‘second DESCRIPTION’);
INSERT INTO identity_5 (description) VALUES (‘third DESCRIPTION’);
INSERT INTO identity_5 (id, description) VALUES (1000,’ fourth DESCRIPTION’);
select * from identity_5;
ID | DESCRIPTION
10 one DESCRIPTION
12 second DESCRIPTION
14 third DESCRIPTION
1000 fourth DESCRIPTION
MINVALUE/NOMINVALUE
指定序列生成的最小值。默认选项为NOMINVALUE,代表没有最小值定义。这个整数值为bigint的最小值,MINVALUE必须小于等于START WITH且必须小于MAXVALUE
代码示例:
CREATE TABLE identity_6(
id int GENERATED BY DEFAULT AS IDENTITY INCREMENT by -2 START WITH 10 MAXVALUE 20 MINVALUE 5,
description VARCHAR2(30)
);
INSERT INTO identity_6 (description) VALUES (‘one DESCRIPTION’);
INSERT INTO identity_6 (description) VALUES (‘second DESCRIPTION’);
INSERT INTO identity_6 (description) VALUES (‘third DESCRIPTION’);
INSERT INTO identity_6 (id, description) VALUES (1000,’sixth DESCRIPTION’);
CYCLE/NOCYCLE
表示序列达值达到限制值后是否循环,NOCYCLE为默选项,表示不循环。如果循环,则当递增序列达到最大值时,循环到最小值;对于递减序列达到最小值时,循环到最大值
代码示例:
--cycle
drop table identity_col;
CREATE TABLE identity_col (
id number GENERATED ALWAYS AS IDENTITY start WITH 10 INCREMENT by 2 maxvalue 15 cycle cache 2,
description VARCHAR2(30)
);
INSERT INTO identity_col (description) VALUES (‘one DESCRIPTION’);
INSERT INTO identity_col (description) VALUES (‘second DESCRIPTION’);
INSERT INTO identity_col (description) VALUES (‘third DESCRIPTION’);
INSERT INTO identity_col (description) VALUES (‘fourth DESCRIPTION’);
select * from identity_col;
--NOCYCLE
CREATE TABLE identity_col1 (
id number GENERATED ALWAYS AS IDENTITY start WITH 10 INCREMENT by 2 maxvalue 15 nocycle cache 2,
description VARCHAR2(30)
);
INSERT INTO identity_col1 (description) VALUES (‘one DESCRIPTION’);
INSERT INTO identity_col1 (description) VALUES (‘second DESCRIPTION’);
INSERT INTO identity_col1 (description) VALUES (‘third DESCRIPTION’);
select * from identity_col1;
ID | DESCRIPTION
10 one DESCRIPTION
12 second DESCRIPTION
14 third DESCRIPTION
CACHE/NOCACHE
定义存放序列的内存块大小,如果不指定,则默认缓存20个序列号
代码示例:
CREATE TABLE identity_7(
id int GENERATED BY DEFAULT AS IDENTITY cache 30,
description VARCHAR2(30)
);
INSERT INTO identity_7 (description) VALUES (‘one DESCRIPTION’);
INSERT INTO identity_7 (description) VALUES (‘second DESCRIPTION’);
INSERT INTO identity_7 (description) VALUES (‘third DESCRIPTION’);
INSERT INTO identity_7 (description) VALUES (‘fourth DESCRIPTION’);
ORDER/NOORDER
该选项用于数据库集群获取有序序列
限制
- 每个表只能指定一个Identity column
- Identity column必须是数字类型,不能是用户自定义数据类型
- Identity column不能有默认子句
- Identity column隐含的具有NOT NULL和NOT DEFERRABLE约束,不能被显示的转换其属性
- CREATE TABLE AS SELECT不会继承identity column属性