2011-10-06 33 views
4

我有以下的列的表:甲骨文 - 修改現有表自動遞增列

NOTEID  NUMBER NOT NULL, 

對於所有意圖和目的,這列是主鍵。這張表有幾千行,每行都有一個唯一的ID。之前,應用程序將從表中選擇MAX()值,添加一個,然後將其用作下一個值。這是一個可怕的解決方案,並且不是事務或線程安全的(實際上,在他們甚至沒有對列進行UNIQUE約束之前,我可以看到相同的NOTEID在9個不同的場合中被複制)。

我對Oracle非常陌生,所以我想知道改變這個表的最好的語法,並且讓這個列自動增量。如果可能的話,我想讓序列中的下一個值是表格中的MAX(NOTEID)+ 1,或者只是讓它開始800。謝謝!

回答

7

如果您的MAX(noteid)爲799,然後嘗試:

CREATE SEQUENCE noteseq 
    START WITH 800 
    INCREMENT BY 1 

然後插入新記錄時,對於NOTEID列,你會怎麼做:

noteseq.nextval 
+0

是否有可能如果沒有特別指定,將列默認爲序列中的下一個值? –

+0

@Mike - 您在實現該邏輯的表上創建一個觸發器,當然 –

+0

明白了 - 所以它不像Postgres那樣可以使DEFAULT值或具有值增加的「SERIAL」列類型的mySQL 。 –

13

你不能改變表格。 Oracle不支持聲明式自動遞增列。您可以創建一個序列

CREATE SEQUENCE note_seq 
    START WITH 800 
    INCREMENT BY 1 
    CACHE 100; 

然後,您可以創建一個觸發器

CREATE OR REPLACE TRIGGER populate_note_id 
    BEFORE INSERT ON note 
    FOR EACH ROW 
BEGIN 
    :new.note_id := note_seq.nextval; 
END; 

,或者,如果你想允許呼叫者指定非默認NOTE_ID

CREATE OR REPLACE TRIGGER populate_note_id 
    BEFORE INSERT ON note 
    FOR EACH ROW 
BEGIN 
    IF(:new.note_id is null) 
    THEN 
    :new.note_id := note_seq.nextval; 
    END IF; 
END; 
+0

感謝您的詳細解答!我會接受roartechs的回答,因爲你已經有30,000 :) –

+1

哈哈哈哈,這很有趣。我們現在如何接受答案?可憐的傢伙代言較少?謝謝! – roartechs

+0

另外,你的回答是第一個,技術上也滿足了我的問題的要求:)而且我認爲在過去的幾個星期裏,我已經接受了Justin在20多個Oracle問題上的回答。 –