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

Sql Oracle-修改现有表以自动递增列,sql,database,oracle,oracle11g,Sql,Database,Oracle,Oracle11g,我有一个表,其中有以下列: NOTEID NUMBER NOT NULL, 出于所有目的,此列都是主键。此表有几千行,每行都有一个唯一的ID。在此之前,应用程序将从表中选择MAX()值,添加一个,然后将其用作下一个值。这是一个可怕的解决方案,并且不是事务或线程安全的(事实上,在他们对列甚至没有唯一的约束之前,我可以看到相同的NOTEID在9种不同的情况下被复制了) 我对Oracle比较陌生,所以我想知道更改此表并使此列自动递增的最佳语法。如果可能的话,我想让序列中的下一个值成为表中的

我有一个表,其中有以下列:

NOTEID      NUMBER NOT NULL,
出于所有目的,此列都是主键。此表有几千行,每行都有一个唯一的ID。在此之前,应用程序将从表中选择MAX()值,添加一个,然后将其用作下一个值。这是一个可怕的解决方案,并且不是事务或线程安全的(事实上,在他们对列甚至没有唯一的约束之前,我可以看到相同的NOTEID在9种不同的情况下被复制了)

我对Oracle比较陌生,所以我想知道更改此表并使此列自动递增的最佳语法。如果可能的话,我想让序列中的下一个值成为表中的MAX(NOTEID)+1,或者从800开始。谢谢

如果最大值(noteid)为799,请尝试:

CREATE SEQUENCE noteseq
    START WITH 800
    INCREMENT BY 1
然后,在插入新记录时,对于NOTEID列,您将执行以下操作:

noteseq.nextval

你不能改变桌子。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\u 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;

如果没有另外指定,是否可以将列默认为序列中的下一个值?@Mike-您可以在表上创建一个触发器来实现该逻辑,确定得到了-因此它不像Postgres那样可以将该值设置为默认值,也不像mySQL那样具有递增值的“串行”列类型。对,没有办法像MySQL那样指定默认的增量值。谢谢你的详细回答!我会接受roartechs的回答,因为你已经有30000:)哈哈哈,真有趣。这就是我们现在接受答案的方式吗?可怜那个名声不好的家伙??谢谢还有,你的回答是第一个,技术上满足了我问题的要求:)我想在过去的几周里,我已经接受了贾斯汀关于各种甲骨文问题的20个答案。