Oracle 12c:如何将现有主键列修改为标识列?

时间:2015-10-06 18:11:07

标签: sql oracle oracle12c

我有一个包含主键列的表,该列从应用程序自动递增。如何在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开始

我该怎么办? 如果不可能,那么有没有可用的解决办法呢?

2 个答案:

答案 0 :(得分:7)

您无法将现有列转换为真实标识列,但您可以通过使用序列作为列的默认值来获得类似的行为。

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值(这与您到达标识列的距离一样近)

如果您需要真实标识列,则需要删除当前的id列,然后将其重新添加为标识列:

alter table tmp_identity drop column id;

alter table tmp_identity 
     add id number(38) 
     generated always as identity;

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

答案 1 :(得分:-5)

您可以使用以下查询

将列从id重命名为identity
ALTER TABLE tmp_identity
RENAME COLUMN id TO identity; 

要按1自动递增并从4开始,我们可以使用序列。

CREATE SEQUENCE identity_incre
MINVALUE 4
START WITH 4
INCREMENT BY 1;

在查询中使用identity_incre序列

INSERT INTO suppliers
(identity, VALUE)
VALUES
(identity_incre.NEXTVAL, 'sample4');