ToB企服应用市场:ToB评测及商务社交产业平台

标题: Oracle 数据库 IDENTITY 列 [打印本页]

作者: 兜兜零元    时间: 2025-1-23 22:54
标题: Oracle 数据库 IDENTITY 列
IDENTITY列是Oracle数据库12c推出的新特性。之所以叫IDENTITY列,是由于其支持ANSI SQL 关键字 IDENTITY,其内部实现照旧使用SEQUENCE。
不外推出这个新语法也是应该的,毕竟MyQL已经有 AUTO_INCREMENT列,而SQL Server也已经有IDENTITY列。
IEDNTITY列最重要用于surrogate key,也就是人造的唯一键。其语法链如下:

语法的文字表述如下:
  1. GENERATED
  2. [ ALWAYS | BY DEFAULT [ ON NULL ] ]
  3. AS IDENTITY [ ( identity_options ) ]
复制代码
GENERATED和AS IDENTITY是必需的。ALWAYS和BY DEFAULT的区别如下:

接下来再看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如下:
  1. -- 创建表
  2. CREATE TABLE staging_t (
  3.     id NUMBER
  4.         GENERATED BY DEFAULT ON NULL AS IDENTITY ( CACHE 100 ),
  5.     c1 VARCHAR2(100),
  6.     c2 DATE
  7. );
  8. -- ETL插入数据(本例插入10条数据)
  9. truncte table staging_t;
  10. insert into staging_t (
  11.   c1,
  12.   c2
  13. )
  14. with lots_of_ints as (
  15. select
  16.   rownum rn
  17. from
  18.   dual
  19. connect by
  20.   rownum  <= 10)
  21. select
  22.   rn,
  23.   sysdate - rn / 1440
  24. from
  25.   lots_of_ints;
  26. -- 查看数据
  27. select * from staging_t;
  28. -- 修改IDENTITY列属性
  29. alter table staging_t modify
  30.   id generated by default on null
  31.   as identity (start with limit value);
  32. -- ETL插入数据(SQL同前)
  33. -- 查看数据(SQL同前)
复制代码
另外几个必要强调的:

参考



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4