Oracle 数据库 IDENTITY 列

news/2024/11/26 5:39:00/

IDENTITY列是Oracle数据库12c推出的新特性。之所以叫IDENTITY列,是由于其支持ANSI SQL 关键字 IDENTITY,其内部实现还是使用SEQUENCE。
不过推出这个新语法也是应该的,毕竟MyQL已经有 AUTO_INCREMENT列,而SQL Server也已经有IDENTITY列。

IEDNTITY列最主要用于surrogate key,也就是人造的唯一键。其语法链如下:

在这里插入图片描述
语法的文字表述如下:

sql">GENERATED
[ ALWAYS | BY DEFAULT [ ON NULL ] ]
AS IDENTITY [ ( identity_options ) ]

GENERATED和AS IDENTITY是必需的。ALWAYS和BY DEFAULT的区别如下:

  • ALWAYS
    如果指定 ALWAYS,则 Oracle Database 始终使用序列生成器为列分配值。如果尝试使用 INSERT 或 UPDATE 明确为列分配值,则将返回错误。这是默认设置。

  • BY DEFAULT
    如果指定 BY DEFAULT,则 Oracle Database 默认使用序列生成器为列分配值,但您也可以明确为列分配指定的值。如果指定 ON NULL,则当后续 INSERT 语句尝试分配计算结果为 NULL 的值时,Oracle Database 将使用序列生成器为列分配值。

接下来再看identity_options,除了黄色的部分(START WITH LIMIT VALUE),其他参数和CREATE SEQUENCE语句完全相同。
在这里插入图片描述
START WITH LIMIT VALUE 是针只能与 ALTER TABLE MODIFY 一起使用。如果指定 START WITH LIMIT VALUE,则 Oracle 数据库将锁定表并查找表中的最大标识列值(对于增加序列)或最小标识列值(对于减少序列),并将该值指定为序列生成器的高水位标记。序列生成器返回的下一个值将是高水位标记 + INCREMENT BY 整数(对于增加序列)或高水位标记 - INCREMENT BY 整数(对于减少序列)。

上面的语法说明有点拗口,简单来说,如果是递增值为1的序列,使用START WITH LIMIT VALUE,下一个值就是1。

这篇文章Matching the start-with value of an identity column with table data很好的解释了的用途。文章中设定了如下的场景,每次ETL之前,需要清空表,然后插入数据,插入的数据希望surrogate key每次都从1开始,这就是通过START WITH LIMIT VALUE实现的。其中使用到的SQL如下:

sql">-- 创建表
CREATE TABLE staging_t (id NUMBERGENERATED BY DEFAULT ON NULL AS IDENTITY ( CACHE 100 ),c1 VARCHAR2(100),c2 DATE
);-- ETL插入数据(本例插入10条数据)
truncte table staging_t;
insert into staging_t (c1,c2
)
with lots_of_ints as (
selectrownum rn
fromdual
connect byrownum  <= 10)
selectrn,sysdate - rn / 1440
fromlots_of_ints;-- 查看数据
select * from staging_t;-- 修改IDENTITY列属性
alter table staging_t modifyid generated by default on nullas identity (start with limit value);-- ETL插入数据(SQL同前)
-- 查看数据(SQL同前)

另外几个需要强调的:

  • CACHE integer指定数据库预先分配并保留在内存中的序列值的数量以便更快地访问。如果您在 Oracle Real Application Clusters 环境中使用序列,Oracle 建议使用 CACHE 设置来增强性能。
  • MAXVALUE和MINVALUE。对于正值,此整数值可以有 28 位或更少的数字,对于负值,此整数值可以有 27 位或更少的数字。简单来说,最大值为1028-1;最小值为-(1027 -1)。理论上,这个最小和最大值都是无法达到的。

参考

  • How to create id with AUTO_INCREMENT on Oracle?
  • Oracle Identity Column With Examples
  • Oracle Database 19c SQL Language Reference
  • Identity Columns in Oracle Database 12c Release 1 (12.1)
  • Oracle IDENTITY column versus PRIMARY KEY

http://www.ppmy.cn/news/1549990.html

相关文章

autogen框架中使用chatglm4模型实现react

本文将介绍如何使用使用chatglm4实现react&#xff0c;利用环境变量、Tavily API和ReAct代理模式来回答用户提出的问题。 环境变量 首先&#xff0c;我们需要加载环境变量。这可以通过使用dotenv库来实现。 from dotenv import load_dotenv_ load_dotenv()注意.env文件处于…

C语言-数学基础问题

一.奇数、偶数问题 1.从键盘上输入一个整数&#xff0c;判断并输出它是奇数还是偶数。 //从键盘上输入一个整数&#xff0c;判断并输出它是奇数还是偶数。 main() {int i;printf("输入一个整数:\n");scanf("%d",&i);if(i%20)printf("它是偶数\n…

使用 OpenCV 进行视频中的行人检测

在计算机视觉领域&#xff0c;行人检测是一个重要的研究方向&#xff0c;它在视频监控、自动驾驶、人机交互等领域都有着广泛的应用。本文将介绍如何使用 OpenCV 库来实现视频中的行人检测。 环境准备 首先&#xff0c;我们需要安装 OpenCV 库。可以通过以下命令来安装&#…

MySQL数据库的算法

MySQL数据库中使用的算法主要包括以下几种&#xff1a; • 联接算法&#xff1a; • Nested-Loop Join&#xff08;NLJ&#xff09;&#xff1a;这是一种基本的连接实现算法&#xff0c;通过双层循环比较数据来获取结果。MySQL数据库根据不同的使用场合&#xff0c;支持两种N…

神经网络12-Time-Series Transformer (TST)模型

Time-Series Transformer (TST) 是一种基于 Transformer 架构的深度学习模型&#xff0c;专门用于时序数据的建模和预测。TST 是 Transformer 模型的一个变种&#xff0c;针对传统时序模型&#xff08;如 RNN、LSTM&#xff09;在处理长时间依赖、复杂数据关系时的限制而提出的…

C#之WPF的C1FlexGrid空间的行加载事件和列事件变更处理动态加载的枚举值

列变更&#xff0c;EnumDataItemStackClassTypeList数据源是枚举配置&#xff0c;实时查询到VM缓存的&#xff0c;如果是定义的枚举就不用这个麻烦了&#xff0c;直接在对象里面获取枚举值匹配&#xff0c;即 public string ApplyStatusName { get { retur…

selinux及防火墙

selinux说明 SELinux 是 Security-Enhanced Linux 的缩写&#xff0c;意思是安全强化的 linux 。 SELinux 主要由美国国家安全局&#xff08; NSA &#xff09;开发&#xff0c;当初开发的目的是为了避免资源的误用。 httpd进程标签&#xff08;/usr/share/nginx/html &#…

Python 获取微博用户信息及作品(完整版)

在当今的社交媒体时代&#xff0c;微博作为一个热门的社交平台&#xff0c;蕴含着海量的用户信息和丰富多样的内容。今天&#xff0c;我将带大家深入了解一段 Python 代码&#xff0c;它能够帮助我们获取微博用户的基本信息以及下载其微博中的相关素材&#xff0c;比如图片等。…