首页 > 数据库 >Oracle 数据库 IDENTITY 列

Oracle 数据库 IDENTITY 列

时间:2024-11-25 17:31:49浏览次数:11  
标签:数据库 生成器 序列 LIMIT Oracle 为列 IDENTITY

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

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

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

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如下:

-- 创建表
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)。理论上,这个最小和最大值都是无法达到的。

参考

标签:数据库,生成器,序列,LIMIT,Oracle,为列,IDENTITY
From: https://blog.csdn.net/stevensxiao/article/details/144027066

相关文章

  • 梧桐数据库中的条件表达式灵活的数据选择与操作
    在数据库操作中,条件表达式是处理数据选择和操作的强大工具。它们允许我们在单个查询中根据条件动态地返回不同的值。梧桐数据库支持多种条件表达式,包括CASE、COALESCE、NULLIF等,这些表达式在数据查询和处理中扮演着重要角色。本文将详细介绍这些条件表达式的功能、语法和典型应用......
  • GaussDB OLTP 云数据库配套工具DAS
    一、前言传统的数据库管理软件,不仅需要下载安装、功能还比较单一,而且已经滞后于云服务的发展模式。华为GaussDB云数据库提供了配套的生态工具数据管理服务DAS。DAS通过与数据库内核的紧密结合,提供了数据库开发、运维、智能诊断一站式云上数据库管理平台,方便用户使用和运维华为......
  • GaussDB数据库SQL系列-层次递归查询
    一、前言层次递归查询是一种常见的SQL查询方式,特别是在一些层次化的数据存储结构中经常用到。本文主要以GaussDB数据库为实验平台,为大家讲解其使用方法。二、GuassDB数据库层次递归查询概念层次化结构可以理解为树状数据结构,由节点构成。举个简单的例子,如下图所示,由子节点向上......
  • GaussDB数据库SQL系列-数据去重
    一、前言数据去重在数据库中是比较常见的操作。复杂的业务场景、多业务线的数据来源等等,都会带来重复数据的存储。本文以GaussDB数据库为实验平台,将为大家详细讲解如何去重。二、数据去重应用场景数据库管理(含备份):在数据库中进行数据去重可以避免数据重复存储、备份,提高数据库......
  • hhdb数据库介绍(9-3)
    计算节点运行相关计算节点启动说明启动计算节点,可以切换到/usr/local/hhdb/hhdb-server/bin目录下,再运行启动脚本,或者直接加上路径:sh/usr/local/hhdb/hhdb/bin/hotdb_serverstart;配置库复制同步状态会影响计算节点启动,计算节点启动或者发生高可用切换Online时配置库必须保......
  • GaussDB数据库的元数据及其管理简介
    一、前言GaussDB是一种分布式的关系型数据库,元数据(表、列、视图、索引、存储过程等对象)是其重要的一部分。元数据是指描述数据的数据,包括数据的定义、结构、属性、关系等信息。本文以GaussDB物理数据库为主,结合元数据的概念简单介绍一下相关内容。二、元数据简介1、元数据定义......
  • GaussDB数据库SQL系列-SQL与ETL浅谈
    一、前言在SQL语言中,ETL(抽取、转换和加载)是一种用于将数据从源系统抽取到目标系统的过程。ETL过程通常包括三个阶段:抽取(Extract)、转换(Transform)和加载(Load)。但这些其实都脱离不了数据库系统,本节从GaussDB数据库生态出发,给大家简单讲一下SQL与ETL的过程与关系。二、SQL与ETL的......
  • GaussDB数据库SQL系列-UNION & UNION ALL
    一、前言SQL(结构化查询语言)是一种用于管理关系型数据库的标准语言。它允许用户通过使用SQL语言来操作数据库中的数据。而在SQL中,UNION是一个非常强大的功能,它可以将多个SELECT语句的结果合并成一个结果集。本文将以GaussDB数据库为例,介绍一下UNION操作符的使用。二、GaussDBUN......
  • GaussDB数据库SQL系列-表连接(JOIN)
    一、前言SQL是用于数据分析和数据处理的最重要的编程语言之一,表连接(JOIN)是数据库中SQL的一种常见操作,在实际应用中,我们需要根据业务需求从两个或多个相关的表中获取信息。二、GaussDBJOINGaussDB是华为推出的企业级分布式关系型数据库。GaussDBJOIN子句是基于两个或者多个表......
  • GaussDB数据库基础函数介绍-上
    ​目录一、函数在数据库中的作用二、GaussDB常用基础函数介绍与示例1、数字操作函数2、时间和日期处理函数3、类型转换函数4、数组函数5、范围函数6、窗口函数7、聚集函数8、安全函数9、系统信息函数10、动态脱敏函数.Tip:由于篇幅缘故,“5.范围函数、6.窗口函数、7.......