1    Identity Columns 说明

在Oracle 12c 之前,表中的列是没有自增功能的,所以要想实现主键的自增,通常的做法是先创建一个序列,在创建一个触发器,来实现自增,在Oracle 12c 中,Oracle 解决了这个问题, Identity Columns的新特性,实现了自增列的功能。

关于Oracle 12c序列的操作,可以直接查看官方手册,有详细的说明。 我们这里重点测试identity columns。

Identity Columns 是自动增加的列,该特性使用默认的序列生成器来强制表列序列按递增或者递减的值来分别值。https://www.cndba.cn/dave/article/219https://www.cndba.cn/dave/article/219https://www.cndba.cn/dave/article/219

SQL> create table cndba (

id1 number generated by default as identity ,

name varchar2(50)

);

Table created.

SQL> insert into cndba(name) values ('tianlesoftware');

1 row created.

SQL> insert into cndba(name) values ('http://cndba.cn');

1 row created.

SQL> insert into cndba(name) values ('http://ahdba.cn');

1 row created.

SQL> commit;

Commit complete.

SQL> select * from cndba;

ID1 NAME

---------- -----------------------------------------------

1 tianlesoftware

2 http://cndba.cn

3 http://ahdba.cn这里id列成功的使用默认的序列生成器来自增。

2    使用generated by default

除了使用默认的序列生成器之外,也可以使用指定的序列来自增,或者仅当插入NULL 的时候才自增。

在语法上,如采用generated by default就是采用默认的序列生成器,此时用户可以插入自己的值,如果使用GENERATED ALWAYS 就是使用特定的序列,此时自增列只能使用序列生成器提供的值,用户无法更改自增列。

如果在添加ON Null 选项,则表示仅当插入NULL时,才会自增。

示例:

SQL> create table ahdba (

id1 number generated by default as identity ,

name varchar2(50)

);

Table created.

SQL> insert into ahdba(name) values ('http://ahdba.com');

1 row created.

SQL> insert into ahdba values(100,'dave');

1 row created.

SQL> commit;

Commit complete.

--注意这里,用户可以插入自增列。

SQL> insert into ahdba values (NULL,'tianlesoftware');

insert into ahdba values (NULL,'tianlesoftware')

*

ERROR at line 1:

ORA-01400: cannot insert NULL into ("SYS"."AHDBA"."ID1")

SQL> select * from ahdba;

ID1 NAME

---------- --------------------------------------------------

1 http://ahdba.com

100 dave

创建仅插入NULL 时才自增的对象:https://www.cndba.cn/dave/article/219https://www.cndba.cn/dave/article/219

create table huaining (

id1 number generated by default on NULL as identity ,

name varchar2(50));

SQL> desc huaining

Name Null? Type

----------------------------------------- -------- ----------------------------

ID1 NOT NULL NUMBER

NAME VARCHAR2(50)

SQL> insert into huaining values (1, '安庆');

1 row created.

SQL> insert into huaining values(20,'怀宁');

1 row created.

SQL> insert into huaining values (NULL,'月山');

1 row created.

SQL> insert into huaining values (NULL,'合肥');

1 row created.

SQL> commit;

Commit complete.

SQL> select * from huaining;

ID1 NAME

---------- --------------------------------------------------

1 安庆

20 怀宁

1 月山

2 合肥

可以看到上面的结果,只有最后2条记录自增了,其他2条记录,采用了我们指定的值。

3    使用Generated Always

上面的实验都是采用默认的序列生成器来自增,也可以使用Generated Always的方式指定独立的序列规则,如果指定为generated always,那么列就不能被用户更新,只能使用序列生成器提供的值。

示例:https://www.cndba.cn/dave/article/219

create table aniqng (

id1 number generated always as identity ,

name varchar2(50));

SQL> desc anqing

Name                       Null?    Type

----------------------------------------- -------- ----------------------------

ID1                       NOT NULL NUMBER

NAME                            VARCHAR2(50)

SQL>  insert into anqing values (1,'aniqng');

insert into anqing values (1,'aniqng')

*

ERROR at line 1:

ORA-32795: cannot insert into a generated always identity column

SQL> !oerr ora 32795

32795,0000, "cannot insert into a generated always identity column"

// *Cause:  An attempt was made to insert a value into an identity column

//          created with GENERATED ALWAYS keywords.

// *Action: A generated always identity column cannot be directly inserted.

//          Instead, the associated sequence generator must provide the value.

SQL> insert into anqing values (NULL,'dave');

insert into anqing values (NULL,'dave')

*

ERROR at line 1:

ORA-32795: cannot insert into a generated always identity column

SQL> insert into anqing (name) values ('安庆');

1 row created.

SQL> insert into anqing (name) values ('怀宁');

1 row created.

SQL> insert into anqing (name) values ('月山');

1 row created.

SQL> commit;

Commit complete.

SQL> select * from anqing;

ID1 NAME

---------- --------------------------------------------------

1 安庆

2 怀宁

3 月山

SQL> update anqing set id1=4 where id1=2;

update anqing set id1=4 where id1=2

*

ERROR at line 1:

ORA-32796: cannot update a generated always identity column

4    修改Identity Columns

可以在创建table时指定identity columns的类型和规则,也可以创建之后使用alter table 来修改,生成器的规则在identity选择中指定。

create table yueshan (

id1 number generated always as identity (start with 8 increment by 3),

name varchar2(50)

);

SQL> insert into yueshan (name) values ('安庆');

SQL> insert into yueshan (name) values ('月山');

SQL> commit;

SQL> select * from yueshan;

ID1 NAME

---------- --------------------------------------------------

8 安庆

11 月山

注意这里的序列开始值和增加的间隔。

可以使用如下SQL 查看identity columns 对应的序列。https://www.cndba.cn/dave/article/219https://www.cndba.cn/dave/article/219https://www.cndba.cn/dave/article/219

SQL> col table_name for a20

SQL> col COLUMN_NAME for a20

SQL>set lin 130

SQL> select table_name,column_name,default_on_null,identity_column,data_default from user_tab_columns where table_name in ('ANIQNG','HUAINING','YUESHAN','CNDBA');

TABLE_NAME         COLUMN_NAME                  DEF IDE DATA_DEFAULT

-------------------- ---------------------------------------- --- --- ------------------------------

CNDBA             ID1                      NO  YES "SYS"."ISEQ$$_92197".nextval

CNDBA             NAME                      NO  NO

HUAINING         ID1                      YES YES "SYS"."ISEQ$$_92201".nextval

HUAINING         NAME                      NO  NO

YUESHAN          ID1                      NO  YES "SYS"."ISEQ$$_92205".nextval

YUESHAN          NAME                      NO  NO

6 rows selected.

5    12c 中Identity columns的限制

1.    一张表里只能有一个identity column。

2.    Identity column 的类型只能是number,不能是用户定义的类型。

3.    对identity column的表进行CTAS 复制时不会继承identity column的属性。

4.    创建identity column时,不能指定DEFAULT 默认值。

5.    Identity column列默认包含not null 和non deferrable约束。

版权声明:本文为博主原创文章,未经博主允许不得转载。

oracle 12c id 自增,Oracle 12c Identity Columns 新特性 和 序列 构成自增列相关推荐

  1. oracle12c密码文件,【转】Oracle 12c 关于密码文件(password)的几个新特性

    oracle数据库软件是获得过最高级别的安全认证,完全超越其它所有数据库软件,并且在可维护性上基于大量的实践需要稳步前行,这里简单列举几个12c 关于password几个新特性. 1. 新的passw ...

  2. oracle新增id怎么写,oracle插入数据时自增ID的解决思路

    一直在用MySQL,从来没有为自增ID发过愁,这初到oracle上,连自增ID都让我挠头,好在互联网资源丰富,我在充分吸取精华后,把我的一点经验总结出来给大家分享分享- 1. 创建一个sequence ...

  3. 12c oracle 修改内存_Oracle12c中性能优化功能增强新特性之重大突破——内存列存储新特性...

    Oracle12c中内存列存储 内存列存储(IM column store) 是Oracle12.1.0.2版本的主要特点.该特点允许列,表,分区和物化视图在内存中以列格式存储,而不是通常的行格式.数 ...

  4. Oracle 12C -- sequence的新特性-会话序列

    2019独角兽企业重金招聘Python工程师标准>>> 如果使用了全局临时表和sequence,有时会遇到一些问题.因为全局临时表与会话(或会话中的事务)相关,而sequence与数 ...

  5. oracle统计id出现次数,oracle 统计sql

    oracle 统计月平均交易次数 : select n_tsc_src_usr_id , floor(count(c_tsc_no)/trunc(months_between(max(d_tsc_re ...

  6. oracle 12c undo,Oracle 12C新特性-临时UNDO段(Temporary Undo Segments) | 信春哥,系统稳,闭眼上线不回滚!...

    在12C版本,为了减少UNDO表空间的使用率及减少REDO和归档日志的产生量,ORACLE推出了临时UNDO段(Temporary Undo Segments)新特性.这个新特性把临时表产生的UNDO ...

  7. 无路可逃:Oracle 12.2 BigSCN新特性可能的DB Link兼容性问题

    在<云和恩墨技术通讯>的3月刊中,我们再次强调了关于 SCN 问题的预警,提醒大家在2019年6月23日之前采取必要的措施. 下载链接: https://cs.enmotech.com/d ...

  8. oracle19c的版本号_Oracle Database 20c/19c/18c/12c发布的新特性介绍

    在介绍Oracle Database 20c新特性时,首先回顾一个关于Oracle12c,oracle18c, oracle19c一些重要的特性: 1.Oracle Database 12c: Mul ...

  9. ORACLE 11GR2 RAC new features 新特性。

    2009年9月Oracle公司发布了期待已久的Oracle 11g R2,本系列文章将给读者一一揭开新版本中的新特性,并会介绍企业如何利用这些新特性将现有的Oracle 9i,10g,11g R1升级 ...

  10. 盘点 Oracle 11g 中新特性带来的10大性能影响

    盘点 Oracle 11g 中新特性带来的10大性能影响 原创 2017-08-02 盖国强 数据和云 Oracle的任何一个新版本,总是会带来大量引人瞩目的新特性,但是往往在这些新特性引入之初,首先 ...

最新文章

  1. 用python做算法_自己用python写的螺旋矩阵生成算法
  2. 简单但经典的算法题:有效字母的异位词
  3. 古诗-豪放派和婉约派
  4. 青客宝团队Consul内部分享ppt
  5. 不就是SELECT COUNT语句吗,竟然能被面试官虐的体无完肤
  6. git 子命令 git tag 常用命令实操教程
  7. 加快linux编译速度,Linux Makefile 编译速度的优化【转】
  8. “软件开发教父” Martin Fowler 从业 40 年最想说这两个字!
  9. 【数据结构】线段树(interval tree)
  10. Java数据库编程基本配置
  11. 感人至深:40岁博士毕业,新任安徽省长王清宪的博士论文后记
  12. 安全运营SOC Security Operations Center
  13. 感冒喝抹茶牛奶的效果
  14. DNS的作用是什么?为什么一定要配置DNS才能上网
  15. 如何把PPT幻灯片压缩到最小
  16. IDEA安装卸载插件
  17. rk3568 移植 GPS/GNSS 模组
  18. 基于360SafeDemo对duilib整体框架的概述
  19. 京东疯狂的JOYS(自动刷硬币/合成)
  20. Think Pad笔记本分区解决思路及方法

热门文章

  1. MP4文件格式详解——元数据moov(一)mvhd box
  2. 分块器评估与语言结构中的递归
  3. The CUDA compiler identification is unknown 解决
  4. 花在照顾子女上的时间对父亲自己的大脑具有可塑性?
  5. Linu基本知识(二)——Linux系统以及相关命令
  6. 用友系统服务器架构,用友ERP-U总体架构.DOC
  7. Jmeter--【作为测试你必须要知道的】基础名词与环境搭建
  8. 操作系统进程进行系统调用详细过程
  9. 未完成:读书笔记01芝加哥大学论文写作指南_Kate L. Turabian
  10. nodejs获取当前连接的网络ip