ORACLE 12C Identity Column(身份列) 实现自增长字段
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(身份列) 实现自增长字段的更多相关文章
- Oracle 12C -- Identity Columns(标识列)
Identity Columns很适合数据库中需要"surrogate keys"的场景.依赖sequence产生器,每行的标识列会被赋予一个自增或自减的值.缺省,标识列在创建的时 ...
- Oracle 12c的自增列Identity Columns
在Oracle的12c版本中,Oracle实现了类似MySQL中的auto_increment的自增列,下面我们看一起Oracle是怎么实现的. Oracle Database 12c Enterpr ...
- Oracle 12C -- 基于sequence的列的默认值
12C支持先创建一个sequence,然后再将该sequence指定为某个列的值的默认表达式. 和"identity column"具有以下不同点: ·对列的个数没有限制 ·seq ...
- oracle 12c中的隐含列
Invisible Columns 使用select * from ,desc 等看不到该列, DROP TABLE tab1 PURGE; CREATE TABLE tab1 ( id NUMB ...
- Oracle 12C -- 在相同的列的集合上创建多个索引
在12C中,可以在相同的列的集合上创建多个索引,但是多个索引的类型要不同.同一时刻,只有一个是可见的. SQL> create table emp_tab as select * from em ...
- 使用sql语句创建修改SQL Server标识列(即自动增长列)
一.标识列的定义以及特点SQL Server中的标识列又称标识符列,习惯上又叫自增列.该种列具有以下三种特点:1.列的数据类型为不带小数的数值类型2.在进行插入(Insert)操作时,该列的值是由系统 ...
- Guid算法与标识列(自动增长字段)在表中的应用
<<1>>int(bigint)+标识列(自动增长字段) 用标识列实现字段自增可以避免并发等问题.不需开发人员自己控制自增,用标识列的字段在Insert的时候不用指定主键的值. ...
- oracle 实现插入自增列(类似SqlServer Identity)
oracle不像sql server 有关键字identity直接可插入数据时自增 ,Oracle是不能用Identity,可以使用Sequence Create Table Tempinfo( id ...
- oracle 12c 列式存储 ( In Memory 理论)
随着Oracle 12c推出了in memory组件,使得Oracle数据库具有了双模式数据存放方式,从而能够实现对混合类型应用的支持:传统的以行形式保存的数据满足OLTP应用:列形式保存的数据满足以 ...
随机推荐
- 如何在Spring Data MongoDB 中保存和查询动态字段
原文: https://stackoverflow.com/questions/46466562/how-to-save-and-query-dynamic-fields-in-spring-data ...
- Android消息机制1-Handler(Java层)
一.概述 在整个Android的源码世界里,有两大利剑,其一是Binder IPC机制,,另一个便是消息机制(由Handler/Looper/MessageQueue等构成的). Android有大量 ...
- 设计模式:单例模式的使用和实现(JAVA)
单例模式的使用 jdk和Spring都有实现单例模式,这里举的例子是JDK中Runtime这个类 Runtime的使用 通过Runtime类可以获取JVM堆内存的信息,还可以调用它的方法进行GC. p ...
- Linux学习手册
入门概述 Linux 简介 Linux 内核最初只是由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的. Linux 是一套免费使用和自由传播的类 Unix ...
- 2018秋招C/C++面试题总结
一.C和C++的区别是什么? C是面向过程的语言,C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛.C中函数不能进行重载,C++函数可以重载C++在C的基础上增添类,C是一个结构化语言,它 ...
- uwp 语音指令
Xml code -------------------------------- <Page x:Class="MyApp.MainPage" xmlns="ht ...
- linux(2)-----新装linux配置
1.配置本机ip,刚装的Linux无内网ip vi /etc/susconfig/network-scripts/ifcfq-ens33 编辑配置文件 最后一行改为yes service net ...
- git cherry-pick 教程
转自:http://www.ruanyifeng.com/blog/2020/04/git-cherry-pick.html 对于多分支的代码库,将代码从一个分支转移到另一个分支是常见需求. 这时分两 ...
- 输入URL后浏览器的过程
In this article, I want my readers to get a picture of a very basic concept of the web world. Previo ...
- 如何配置https
1.创建证书:keytool -genkey -alias wsria -keyalg RSA -keystore d:/keys/wsriakey 其中姓氏和组织名称为登录时的域名:如localho ...