Oracle 数据库 IDENTITY 列

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 NUMBER
        GENERATED 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 (
select
  rownum rn
from
  dual
connect by
  rownum  <= 10)
select
  rn,
  sysdate - rn / 1440
from
  lots_of_ints;

-- 查看数据
select * from staging_t;

-- 修改IDENTITY列属性
alter table staging_t modify
  id generated by default on null
  as identity (start with limit value);

-- ETL插入数据(SQL同前)
-- 查看数据(SQL同前)

另外几个需要强调的:

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

参考

相关推荐
麦聪聊数据28 分钟前
电商数据运营的最佳实践:WebSQL 如何兼顾数据分析效率与生产库安全
数据库·sql·低代码·restful
oradh1 小时前
Oracle数据库实例入门概述
数据库·oracle·oracle实例·oracle实例入门·oracle基础
大黄说说1 小时前
数据库事务的ACID特性:从理论到实现的深度解析
数据库·oracle
大江东去浪淘尽千古风流人物1 小时前
【Basalt】 VIO(sqrt_keypoint_vio)主流程measure函数梳理
数据库·人工智能·python·机器学习·oracle
jnrjian1 小时前
RAC archivelog 在共享盘下就可以在一个node进行备份
数据库·sql
羊小猪~~2 小时前
【QT】-- QT操作数据库
数据库·qt·oracle
吠品3 小时前
Docker Desktop部署Weaviate向量数据库:从配置到生产环境全流程
数据库·oracle·eureka
码云数智-园园3 小时前
关系型与非关系型数据库:核心区别与业务场景解析
数据库·oracle
Elastic 中国社区官方博客3 小时前
从 Elasticsearch runtime fields 到 ES|QL:将传统工具适配到当前技术
大数据·数据库·sql·elasticsearch·搜索引擎·全文检索
ClouGence3 小时前
数据迁移同步工具 CloudCanal-v5.5.0.0 发布,支持 RETL(定时扫描同步)
数据库·mysql·postgresql·oracle·sqlserver·kafka·etl