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

问题描述 投票:0回答:3

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

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

sql oracle oracle12c
3个回答
12
投票

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

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
值(这与您可以获取的身份列最接近)

如果您想要一个real标识列,您需要删除当前的

id
列,然后将其重新添加为标识列:

alter table tmp_identity drop column id;

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

请注意,在这种情况下您不应添加

start with 4
,以便所有行都会获得新的唯一编号


0
投票
create table tmp_identity (
   ID number(100) primary key,
   value varchar2(100)
);

ID        VALUE
---------------
1         Sample 1
2         Sample 2
3         Sample 3

alter table tmp_identity 
add ( ID2  number(100)  GENERATED BY DEFAULT AS IDENTITY INCREMENT BY 1 START WITH 4 NOMINVALUE NOMAXVALUE );

update tmp_identity  set ID2 = ID;
commit;

alter table tmp_identity 
modify ( ID2  number(100)  GENERATED ALWAYS AS IDENTITY INCREMENT BY 1 START WITH 1 NOMINVALUE NOMAXVALUE );

alter table tmp_identity drop column ID;
alter table tmp_identity rename column ID2 to ID;
alter table tmp_identity add constraint primary key ( ID ) ENABLE;

-13
投票

您可以使用以下查询将列从

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');
© www.soinside.com 2019 - 2024. All rights reserved.