我有一个表,其中包含一个主键列,该主键列是从应用程序中自动递增的。如何在 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
列变成身份列,这将-
我该怎么做? 如果不可能,是否有任何解决方法?
您无法将现有列转变为真正的标识列,但您可以通过使用序列作为列的默认值来获得类似的行为。
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
,以便所有行都会获得新的唯一编号
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;
您可以使用以下查询将列从
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');