【问题标题】:Unique sequence for a column in oracle tableoracle表中列的唯一序列
【发布时间】:2017-01-17 10:35:36
【问题描述】:

我正在尝试加载一个表,其中有一个名为 E_id 的 PK 列。每次在 informatica 级别将一行加载到该表中时,我都想为该列生成一个唯一 ID。但我希望这个 e_id 列在表级别生成唯一值。我可以通过在表创建脚本本身中向该列写入查询来实现这一点吗? 目前我尝试了这种默认值的方法

e_id NUMBER DEFAULT TO_NUMBER(TO_CHAR(SYSTIMESTAMP, 'YYYYMMDDHH24MISSFF9')) NOT NULL

虽然有时我会为两条记录获得相同的值。 有人可以帮忙解决这个问题吗?

TIA。

【问题讨论】:

  • 为什么不简单地使用自动增量列?

标签: sql oracle timestamp unique


【解决方案1】:

最常见的方法之一是使用序列

1 创建序列

2 在插入行触发器之前将值填充到 pk 列中

create sequence GSEQUENCE
minvalue 1000
maxvalue 99999999999999999
start with 93581
increment by 1
cache 20;


CREATE OR REPLACE TRIGGER BI_DOCUMENTS
  BEFORE INSERT
  on DOCUMENTS

  for each row
declare numrows INTEGER;
begin


select gsequence.nextval
into :new.id_DOCUMENT
from dual;

end;
/

【讨论】:

  • 非常感谢。这有帮助!
【解决方案2】:

如果您使用的是 12c,最简单的方法是使用 IDENTITY 列。每当您插入记录时,Oracle 都会自动为该列生成一个唯一值。

在以前的版本中,您可以定义一个序列并通过触发器生成它或直接在插入语句中引用它。

您提到了 Informatica。我已经很久没有使用它了,但我似乎记得有一种使用 Informatica 生成唯一 ID 的简单方法。

【讨论】:

  • 是的,但这里的约束是我不能使用 informatica 为这些列加载唯一值,否则我会很容易地使用序列生成器转换。这就是我的限制。我需要找到一种在表脚本级别填充此列的方法。
  • 如果它必须纯粹在表脚本级别,那么您将需要在 12c 上,否则听起来触发器就是要走的路。
【解决方案3】:

您可以使用对所有练习目的唯一的全局唯一 ID (GUID)。许多系统使用 GUID 来生成唯一 ID。

select sys_guid() from dual

转入here

虽然 GUID 提供了真正随机的唯一 ID,但如果您需要顺序唯一值,您始终可以使用 Oracle 序列。

Oracle 没有“自动递增”列,但您可以通过触发器获得类似的结果。

编辑:你也可以参考这个链接How to generate a GUID in Oracle?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 2017-11-02
    • 2017-04-12
    • 1970-01-01
    • 2011-04-18
    相关资源
    最近更新 更多