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. 如何在Spring Data MongoDB 中保存和查询动态字段

    原文: https://stackoverflow.com/questions/46466562/how-to-save-and-query-dynamic-fields-in-spring-data ...

  2. Android消息机制1-Handler(Java层)

    一.概述 在整个Android的源码世界里,有两大利剑,其一是Binder IPC机制,,另一个便是消息机制(由Handler/Looper/MessageQueue等构成的). Android有大量 ...

  3. 设计模式:单例模式的使用和实现(JAVA)

    单例模式的使用 jdk和Spring都有实现单例模式,这里举的例子是JDK中Runtime这个类 Runtime的使用 通过Runtime类可以获取JVM堆内存的信息,还可以调用它的方法进行GC. p ...

  4. Linux学习手册

    入门概述 Linux 简介 Linux 内核最初只是由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的. Linux 是一套免费使用和自由传播的类 Unix ...

  5. 2018秋招C/C++面试题总结

    一.C和C++的区别是什么? C是面向过程的语言,C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛.C中函数不能进行重载,C++函数可以重载C++在C的基础上增添类,C是一个结构化语言,它 ...

  6. uwp 语音指令

    Xml code -------------------------------- <Page x:Class="MyApp.MainPage" xmlns="ht ...

  7. linux(2)-----新装linux配置

    1.配置本机ip,刚装的Linux无内网ip vi /etc/susconfig/network-scripts/ifcfq-ens33    编辑配置文件 最后一行改为yes service net ...

  8. git cherry-pick 教程

    转自:http://www.ruanyifeng.com/blog/2020/04/git-cherry-pick.html 对于多分支的代码库,将代码从一个分支转移到另一个分支是常见需求. 这时分两 ...

  9. 输入URL后浏览器的过程

    In this article, I want my readers to get a picture of a very basic concept of the web world. Previo ...

  10. 如何配置https

    1.创建证书:keytool -genkey -alias wsria -keyalg RSA -keystore d:/keys/wsriakey 其中姓氏和组织名称为登录时的域名:如localho ...