【问题标题】:Auto Incremant composite key Oracle自动增量复合键 Oracle
【发布时间】:2014-03-18 01:01:07
【问题描述】:

如何根据Oracle中特定列的值拥有多个序列;也就是说,为该列的每个不同值创建新的Sequence

表格是:

  CREATE TABLE TEST 
     (
      TYPE VARCHAR2(20) NOT NULL ,
      SERIAL_NUM INT NOT NULL,
      CONSTRAINT TEST_PK PRIMARY KEY 
      (
        TYPE,
       SERIAL_NUM 
      )
      ENABLE 
    );

此链接:How to create id with AUTO_INCREMENT on Oracle?

展示了如何生成自动增量Sequence,假设主键是一个属性。 如何为TYPE 列中的每个唯一值设置单独的Sequence

我正在考虑为TYPE 中的每个可能值创建多个Sequences,为每个Sequence 创建Trigger,并根据TYPE 列值添加ifcondition 进行调情。但是,我意识到这不是正确的方法,因为我需要为添加的任何新 TYPE 创建新的 SequenceTrigger

样本数据应类似于以下内容:

TYPE    SERIAL_NUM
X             1
X             2
X             3
Y             1
Y             2
Z             1
Z             2
Z             3
Z             4

任何建议...

【问题讨论】:

  • 是什么阻止您对所有类型使用单个序列?
  • 您要解决的业务问题是什么?为什么您要求必须有一行 serial_num 为 1 表示 type A,然后另一行 serial_num 为 1 表示 type B? serial_num 值是唯一的,你会遇到什么问题?希望您不是在尝试创建一组无间隙的值...
  • 实际上,没有什么能阻止我为每件商品拥有唯一的序列号。我在问这是否可能。另外,让我想到的是我有TYPEcolumn,它是主键的一部分,我认为数据会更有条理,更容易通过@FrankSchmitt @JustinCave

标签: sql oracle triggers sequence auto-generate


【解决方案1】:

Oracle 中没有用于此的内置功能。

解决方案 1。

为每种类型创建一个序列。如果可以在运行时添加新类型,那么您需要在运行时执行 DDL(使用 EXECUTE IMMEDIATE)。如果有很多类型,你会得到很多序列。

解决方案 2。

在单独的表中实现您自己的类似序列的功能,每种类型都有一行以跟踪下一个值。请务必使用SELECT FOR UPDATE,如果使用此选项,通常要注意并发问题。

CREATE TABLE PseudoSequence (
  TYPE    VARCHAR2(20) PRIMARY KEY,
  SEQ_NO  INT NOT NULL
);

请注意,选项 1 在并发插入相同类型的记录方面更具可扩展性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 2011-09-01
    • 2016-11-11
    相关资源
    最近更新 更多