2014-02-18 8 views
0

Oracle의 특정 열 값에 따라 여러 시퀀스를 갖는 방법; 즉, 해당 열의 각기 다른 값에 대해 새 Sequence입니다.자동 Incremant 복합 키 Oracle

표는 다음과 같습니다

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을 구분하는 방법은 무엇입니까?

I는 TYPE 각 가능한 값을 만드는 여러 SequencesSequence 대한 Trigger을 만들고 TYPE 열 값에 기초 유혹 if위한 조건을 추가하는 것을 생각 하였다. 그러나 새로운 TYPE을 추가하기 위해 새로운 SequenceTrigger을 새로 작성해야하므로 올바른 방법이 아님을 알았습니다.

샘플 데이터는 다음과 비슷해야합니다

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

어떤 제안 ...

+1

모든 유형에 대해 단일 시퀀스를 사용하지 못하게하는 이유는 무엇입니까? –

+1

해결하려는 비즈니스 문제는 무엇입니까? 왜'serial_num '이'type' A에 대해 1이고'serial_num'이'type' B에 대해 1 인 행이 필요하다는 요구 사항이 있습니까? 'serial_num' 값이 유일 할 때 어떤 문제가 발생합니까? 다행스럽게도 갭이없는 값 집합을 만들려고하지는 않기를 바랍니다 ... –

+0

사실, 각 항목에 대해 고유 한 일련 번호를 가질 수 없습니다. 나는 그것이 가능한지 묻고 있었다. 또한 내가 생각할 수있는 것은 기본 키의 일부인'TYPE' 칼럼을 가지고 있으며, 데이터가 더 체계적이고 쉽게 전달 될 것이라고 생각했습니다. @FrankSchmitt @JustinCave – Salman

답변

0

이 오라클에는 내장 기능이 없습니다. 1.

솔루션은 각 유형의 시퀀스를 생성합니다. 새 유형을 런타임에 추가 할 수있는 경우 EXECUTE IMMEDIATE를 사용하여 런타임에 DDL을 수행해야합니다. 많은 타입이 있다면 많은 시퀀스를 얻을 수 있습니다.

솔루션 2.

는 다음 값을 추적하는 종류마다 1 개의 행과 별도의 테이블에서 자신의 순서와 같은 기능을 구현합니다. SELECT FOR UPDATE을 사용해야하며 일반적으로이 옵션을 사용하는 경우 병행성에주의해야합니다.

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

주는 옵션 1은 동일한 유형의 레코드를 동시에 삽입에 관한 확장 성이다.