我有一个包含以下列的表:
NOTEID NUMBER NOT NULL,
对于所有意图和目的,此列是主键。该表有几千行,每行都有一个唯一的ID。之前,应用程序将从表中选择MAX()值,添加一个,然后将其用作下一个值。这是一个可怕的解决方案,并不是事务或线程安全(事实上,在他们甚至没有对列的UNIQUE约束之前,我可以看到相同的NOTEID在9个不同的场合重复)..
我对Oracle很陌生,所以我想知道改变此表的最佳语法,并使该列自动增量。如果可能的话,我想让序列中的下一个值为表格中的MAX(NOTEID)+ 1,或者只是将其设为800或其他值。谢谢!
答案 0 :(得分: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;
答案 1 :(得分:7)
如果你的MAX(注释)是799,那么试试:
CREATE SEQUENCE noteseq
START WITH 800
INCREMENT BY 1
然后在插入新记录时,对于NOTEID列,您可以执行以下操作:
noteseq.nextval