我有一个表,其中包含一个主键列,该列可从应用程序自动递增。如何在Oracle 12c中将列修改为身份列

下面提供了一个示例案例-

create table tmp_identity (
   id number(100) primary key,
   value varchar2(100)
);

假设我们用以下数据填充了表格-
ID        VALUE
---------------
1         Sample 1
2         Sample 2
3         Sample 3

我们计划要做的是将此id列转换为身份列,这将使-
  • 自动增加1
  • 从4开始

  • 我该怎么做?
    如果不可能,那么是否有任何解决方法?

    最佳答案

    您不能将现有的列变成真实的标识列,但是可以通过使用序列作为该列的默认值来获得类似的行为。

    create sequence seq_tmp_identity_id
      start with 4
      increment by 1;
    

    然后使用:
    alter table tmp_identity
       modify id
       default seq_tmp_identity_id.nextval;
    

    使列使用序列作为默认值。如果需要,可以使用default on null覆盖插入过程中提供的显式null值(这与您可以找到的identity列非常接近)

    如果要使用真实身份列,则需要删除当前的id列,然后将其重新添加为身份列:
    alter table tmp_identity drop column id;
    
    alter table tmp_identity
         add id number(38)
         generated always as identity;
    

    请注意,在这种情况下,您不应该添加start with 4,以便所有行都获得一个新的唯一编号

    关于sql - Oracle 12c : How can I modify an existing primary key column to an identity column?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32976743/

    10-13 22:56