首页 > Oracle, Oracle SQL > 创建带序列的表列

创建带序列的表列

2021年1月16日

要求数据库版本12c及以上

语法

GENERATED (ALWAYS | (BY DEFAULT [ON NULL])) AS IDENTITY
[sequence_options,...]

语法解析

语法 语法说明
GENERATED ALWAYS AS IDENTITY 该列永远使用序列产生的值
GENERATED BY DEFAULT AS IDENTITY 该类未赋值时使用序列产生的值
GENERATED BY DEFAULT ON NULL AS IDENTITY 该类为空时使用序列产生的值

举个栗子

示例1

1.创建表

CREATE TABLE  tname1 ( id INTEGER GENERATED ALWAYS AS IDENTITY, 
name varchar2(10))

2.插入数据

--错误的使用方式
HR@pdb1>insert into tname1 values (1,'angu')
  2  ;
insert into tname1 values (1,'angu')
*
ERROR at line 1:
ORA-32795: cannot insert into a generated always identity column

解释: 因为已经显示的指定了序列,所以在插入的时候不能再指定了

--正确的使用方式
HR@pdb1>insert into tname1 (name )  values ('angu');

HR@pdb1>select * from tname1;
        ID NAME
---------- ------------------------------
         1 angu

示例2

1.创建表

CREATE TABLE  tname2 (
id number GENERATED BY DEFAULT AS IDENTITY, 
name varchar2(10));

2.插入数据

insert into tname2 values (2,'angu');
insert into tname2 (name) values ('ansiheng');

3.查询数据

HR@pdb1>select * from tname2;

        ID NAME
---------- ------------------------------
         2 angu
         1 ansiheng

解释:插入第二条数据的时候未指定id的值,此时使用序列的值。

4.插入无效数据

HR@pdb1>insert into tname2 values (null, 'invalid');
insert into tname2 values (null, 'invalid')
                           *
ERROR at line 1:
ORA-01400: cannot insert NULL into ("HR"."TNAME2"."ID")

指定了ID列,此时不使用序列产生的值,但插入的值为NULL,违反了非空约束。(带序列的列不能为空)

示例3

1.创建表

CREATE TABLE  tname3 (
id number GENERATED BY DEFAULT AS IDENTITY, 
name varchar2(10),
PRIMARY KEY (id)
);

2.插入数据

--第一次插入
>insert into tname3 values (1,'angu')
  2  ;
--第二次插入
HR@pdb1>insert into tname3 (name) values ('ansiheng');
insert into tname3 (name) values ('ansiheng')
*
ERROR at line 1:
ORA-00001: unique constraint (HR.SYS_C007585) violated
--第三次插入
HR@pdb1>insert into tname3 (name) values ('ansiheng');

解释:第二次插入的时候因为未指定ID,所以使用序列产生的值,该序列产生的值是1,但被第一次插入的时候使用了,所以报了主键冲突,再次执行时产生的序列是2,这次插入成功了。

示例4

1.创建表

CREATE TABLE  tname4 (
id number GENERATED BY DEFAULT ON NULL AS IDENTITY, 
name varchar2(10)
)

2.插入数据

--第一次插入数据
HR@pdb1>insert into tname4 values (1,'angu');
1 row created.
--第二次插入数据
HR@pdb1>insert into tname4 (name) values ('ansiheng1');
1 row created.
--第三次插入数据
HR@pdb1>insert into tname4  values (null,'chuwu');
1 row created.

解释 第二次插入数据由于未提供ID列,使用了序列产生的值,第三次插入出入的数据为NULL,同样使用了序列产生的值

3.查询数据

HR@pdb1>select * from tname4;
        ID NAME
---------- ------------------------------
         1 angu
        10 ansiheng1
        11 chuwu

示例5

1.创建表

CREATE Table tname5 (
id number   GENERATED ALWAYS AS IDENTITY
(START WITH 1
INCREMENT BY 2 
CYCLE 
MAXVALUE 100000 
CACHE 200),
name varchar2(10))

2.插入数据

insert into tname5 (name) values('angu');

insert into tname5 (name) values('ansiheng');

3.查询数据

HR@pdb1>select * from tname5;

        ID NAME
---------- ------------------------------
         1 angu
         3 ansiheng

解释 因为序列中的步长(INCREMENT BY)是2, 所以第二次插入数据产生的序列值是3,还有因为指定了CYCLE,必须同时指定 MAXVALUE

本文的评论功能被关闭了.