2014-02-18 67 views
0

如何根據Oracle中特定列的值獲取多個序列;即對於該列的每個不同值,新的Sequence自動增量組合密鑰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

我想在TYPE創建多個Sequences對於每個可能的值,對於每個Sequence創建Trigger和添加if條件基於TYPE列值調情。但是,我意識到這不是正確的方法,因爲我需要爲新增的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

你想解決什麼商業問題?你爲什麼要求必須有一行,'type' A的'serial_num'爲1,而'type' B的另一行'serial_num'爲1?使'serial_num'值是唯一的,你會遇到什麼問題?希望你沒有試圖創造一個沒有差距的價值觀...... –

+0

其實,沒有什麼能夠阻止我爲每件商品擁有唯一的序列號。我在問是否可能。此外,讓我想到的是,我擁有屬於主鍵的「類型」列,我認爲數據將更加有組織,並且更容易通過@FrankSchmitt @JustinCave – Salman

回答

0

有在甲骨文對此沒有內置的功能。

解決方案1.

爲每種類型創建一個序列。如果可以在運行時添加新類型,則需要在運行時執行DDL(使用EXECUTE IMMEDIATE)。如果有很多類型,你會得到很多序列。

解決方案2.

在一個單獨的表,每一行對應一個類實現自己的序列相似的功能來跟蹤下一個值。一定要使用SELECT FOR UPDATE,如果使用此選項,一般應注意併發問題。

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

請注意,關於併發插入相同類型的記錄,選項1更具可擴展性。