Oracle 12c提供的Identity Column特性简化了自增字段的定义。

声明自增字段通常有3种常见的用法,以下三种方式都支持INSERT语句中省略自增字段的插入,但有些许差别。

1. GENERATED [ALWAYS] AS IDENTITY

此时ALWAYS关键字是可选的:

create table tb_test (
id number GENERATED ALWAYS AS IDENTITY,
name varchar2(100)
);

此时试图插入指定ID字段的元组将报错,因为ID字段总是自动生成的,例如,执行下述语句:

INSERT INTO TB_TEST VALUES(1, 'Zyon');

将报:

ORA-32795: 无法插入到“始终生成”身份列

2. GENERATED BY DEFAULT AS IDENTITY

create table tb_test2 (
id number GENERATED BY DEFAULT AS IDENTITY,
name varchar2(100)
);

此时可以插入指定ID列的元组,但不能指定ID列为NULL

如:下述语句正常执行

INSERT INTO TB_TEST2 VALUES(1, 'Zyon');

但如下语句将会报错:

INSERT INTO TB_TEST2 VALUES(NULL, 'Darren');

3. GENERATED BY DEFAULT ON NULL AS IDENTITY

create table tb_test3 (
id number GENERATED BY DEFAULT on null AS IDENTITY,
name varchar2(100)
);

此时可以插入指定ID列的元组,也可以指定插入ID列为NULL

如下语句正常执行:

INSERT INTO TB_TEST3 VALUES(NULL, 'Darren');

注意

当自增列还要求唯一时,上述情形2和情形3将带来一个问题。

上述情形2和情形3允许插入指定自增列的元组,同时自增列自增时维护着下一次将要生成的序列号。所以如果同时支持自增,又插入了某个指定序列号的元组,后续插入时如果忽略自增列,那么当自增序列号达到指定序列号时,将会出现插入失败的情形。

但是此时自增计数器继续增加,所以下一次忽略自增列的插入可能又恢复正常,除非下一个序列号也被指定插入占用了。

例如:

忽略ID字段插入了9个元组(ID取值1-9),突然指定ID为10插入第10个元组,然后又忽略ID字段插入时,因为10已经被占用,如果自增列要求唯一,将会出现冲突。

所以最好还是统一插入时SQL的形式,不要混用。

参考:

http://www.xifenfei.com/2015/03/oracle-12c-新特性identity-columns-实现oracle自增长列功能.html

ORACLE 12C Identity Column(身份列) 实现自增长字段的更多相关文章

  1. Oracle 12C -- Identity Columns(标识列)

    Identity Columns很适合数据库中需要"surrogate keys"的场景.依赖sequence产生器,每行的标识列会被赋予一个自增或自减的值.缺省,标识列在创建的时 ...

  2. Oracle 12c的自增列Identity Columns

    在Oracle的12c版本中,Oracle实现了类似MySQL中的auto_increment的自增列,下面我们看一起Oracle是怎么实现的. Oracle Database 12c Enterpr ...

  3. Oracle 12C -- 基于sequence的列的默认值

    12C支持先创建一个sequence,然后再将该sequence指定为某个列的值的默认表达式. 和"identity column"具有以下不同点: ·对列的个数没有限制 ·seq ...

  4. oracle 12c中的隐含列

      Invisible Columns 使用select * from ,desc 等看不到该列, DROP TABLE tab1 PURGE; CREATE TABLE tab1 ( id NUMB ...

  5. Oracle 12C -- 在相同的列的集合上创建多个索引

    在12C中,可以在相同的列的集合上创建多个索引,但是多个索引的类型要不同.同一时刻,只有一个是可见的. SQL> create table emp_tab as select * from em ...

  6. 使用sql语句创建修改SQL Server标识列(即自动增长列)

    一.标识列的定义以及特点SQL Server中的标识列又称标识符列,习惯上又叫自增列.该种列具有以下三种特点:1.列的数据类型为不带小数的数值类型2.在进行插入(Insert)操作时,该列的值是由系统 ...

  7. Guid算法与标识列(自动增长字段)在表中的应用

    <<1>>int(bigint)+标识列(自动增长字段) 用标识列实现字段自增可以避免并发等问题.不需开发人员自己控制自增,用标识列的字段在Insert的时候不用指定主键的值. ...

  8. oracle 实现插入自增列(类似SqlServer Identity)

    oracle不像sql server 有关键字identity直接可插入数据时自增 ,Oracle是不能用Identity,可以使用Sequence Create Table Tempinfo( id ...

  9. oracle 12c 列式存储 ( In Memory 理论)

    随着Oracle 12c推出了in memory组件,使得Oracle数据库具有了双模式数据存放方式,从而能够实现对混合类型应用的支持:传统的以行形式保存的数据满足OLTP应用:列形式保存的数据满足以 ...

随机推荐

  1. Android 已发行多年,移动 App 已经趋近饱和,那么 Android 开发还会有那么吃香吗?

    一.关于Android的前景 不断地也听见很多人在谈做Android是否还有前途.Android研发在走下坡路了.Android的工作太难找了.Android是不是已经凉了...... 对于这些其实我 ...

  2. dubbo学习实践(2)之Dubbo入门Demo

    开篇之前,先来了解下dubbo服务治理与技术架构,直接看图 dubbo技术架构图: 1. 新建dubbo项目,目录结构如下 代码说明: 1.代码分为Provider(服务提供方)与consumer(服 ...

  3. CYPEESS USB3.0程序解读之---GPIO

    CPRESS 官方给出的SDK1.1中(目前最新的SDK),提供了大量的例程供我们开发软件的时候作参考,就像STM32的开发一样提供了库一样,但是又不是库,仅仅是参考例程. 首先看一个简单一点的GPI ...

  4. A Telnet Client Using Expect

    The following expect script achieves a simple telnet client: login -> send command -> exit. Th ...

  5. VIM正则表达式的懒惰模式

    例如有如下一段话: Another whale sighting occurred on , <2004>. AK and HI 要匹配每一个<...>,如果用<.> ...

  6. Use w3m as Web Browser

    Installation: apt-get install w3m. use "a" to input text, "tab" to jump between ...

  7. go配置私有仓库 (go mod配置私有仓库)

    windows 配置go私有仓库 一.环境 1.私有gitlab (gitlab.xxx.com) 2.go 1.16.3 3.win10系统, 家目录:C:\Users\Administrator, ...

  8. labuladong 05.16 微信直播

    labuladong 05.16 微信直播 一.基础: 1.校招相关 1)扫盲 秋招:8-10月 提前批:7月 暑期实习:3-5月 非必须 2)关注公司前景,部门信息,公司财报 企查查,天眼查,多获取 ...

  9. bootstrap导航条报错 Uncaught TypeError: Cannot convert object to primitive value

    原文: https://feiffy.cc/uncaught-typeerror-cannot-convert-object-to-primitive-value 最近发现我的博客页面移动端上下拉菜单 ...

  10. 【译】JavaScript async / await:好的部分,陷阱和如何使用

    async/await提供了一种使用同步样式代码异步访问资源的选项,而不会阻塞主线程.然而,使用它有点棘手.在本文中,我们将从不同的角度探讨async / await,并将展示如何正确有效地使用它们. ...