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. 【LeetCode】738. 单调递增的数字

    738. 单调递增的数字 知识点:字符串:贪心 题目描述 给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增. (当且仅当每个相邻位数上的数字 x ...

  2. 连通图与Tarjan算法

    引言 Tarjan算法是一个基于深度优先搜索的处理树上连通性问题的算法,可以解决,割边,割点,双连通,强连通等问题. 首先要明白Tarjan算法,首先要知道它能解决的问题的定义. 连通图 无向图 由双 ...

  3. 01-ADB命令获取包名、界面名

    命令代码 adb shell dumpsys window |findstr mFocusedApp

  4. 熟悉而陌生的新朋友——IAsyncDisposable

    本文作者--句幽 在.NET Core 3.0的版本更新中,官方我们带来了一个新的接口 IAsyncDisposable. 小伙伴一看肯定就知道,它和.NET中原有的IDisposable接口肯定有着 ...

  5. docker harbor安装

    # 官网下载离线包,https://github.com/goharbor/harbor/releases src]# tar xf harbor-offline-installer-v1.8.3.t ...

  6. 把 nodejs koa2 制作的后台接口 部署到 腾讯云服务器

    我 使用 nodejs koa2框架 制作后端接口, 现在将nodejs koa2 部署到服务器 koa2项目 实现 接口 可以看我的 这篇文章: 简单实现 nodejs koa2 mysql 增删改 ...

  7. spring4整合hibernate5以及出现的问题解决办法

    每一次的学习,都是一小步一小步的进行的,学习语言,重要的是能把hello world写出来 以及在学习过程中出现的问题能够及时的记录并总结 spring目前最新的版本是4.3,而hibernate是5 ...

  8. 异步编程之EAP

    一.概述 前面我们了解到了APM编程模式,但APM不支持对异步操作的取消和没有提供对进度报告的功能. 对于界面程序来说,进度报告和取消操作的支持也是必不可少的,为了支持这些功能,微软在.NET 2.0 ...

  9. C#多线程---I/O线程实现异步请求

    一.场景 利用I/O线程来模拟浏览器对服务器请求的异步操作. 二.例子 1 using System; 2 using System.Collections.Generic; 3 using Syst ...

  10. 【C#】Enum,Int,String的互相转换 枚举转换

    Enum为枚举提供基类,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用 Int32.编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举. 注意:枚举类型的基 ...