Oracle - 修改现有表以自动增加列

时间:2011-10-06 22:19:17

标签: sql database oracle oracle11g

我有一个包含以下列的表:

NOTEID      NUMBER NOT NULL,

对于所有意图和目的,此列是主键。该表有几千行,每行都有一个唯一的ID。之前,应用程序将从表中选择MAX()值,添加一个,然后将其用作下一个值。这是一个可怕的解决方案,并不是事务或线程安全(事实上,在他们甚至没有对列的UNIQUE约束之前,我可以看到相同的NOTEID在9个不同的场合重复)..

我对Oracle很陌生,所以我想知道改变此表的最佳语法,并使该列自动增量。如果可能的话,我想让序列中的下一个值为表格中的MAX(NOTEID)+ 1,或者只是将其设为800或其他值。谢谢!

2 个答案:

答案 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