我在列上使用IDENTITY子句创建了一个表,如下所示:
CREATE TABLE tablename
(
id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
c1 VARCHAR2 (100),
c2 VARCHAR2 (100),
c3 VARCHAR2 (100)
);
然后我在这个表中插入了许多行:
INSERT INTO tablename(c1,c2,c3)
VALUES('a','b','c')
INSERT INTO tablename(c1,c2,c3)
VALUES('d','e','f')
...
为每行自动生成id列为1,2等。
然后我需要导出表和数据并导入到新环境。我将数据导出为xls文件,在新环境中创建表,然后从xls文件导入数据。
数据导入成功,但当我尝试插入新行时,我遇到错误
ORA-00001:违反了唯一约束(APPS.SYS_C00453325)
我认为这是因为id列再次尝试从1开始,其中导入数据中已存在id为1的行。
有没有办法让IDENTITY列从导入的最高id值继续?
我意识到使用INSERT脚本导入数据可以解决此问题。使用任何其他方法导出/导入数据是否被视为不良做法?
任何建议都非常感谢。
修改
我也发现即使使用INSERT脚本也会发生同样的错误。由于在INSERT期间提供了id值,因此永远不会访问IDENTITY序列,因此永远不会递增。是否可以使用IDENTITY从我手动插入的ID中继续序列?
答案 0 :(得分:1)
您可以使用start with limit value
修改列的生成属性。
create table demo1
( id integer generated by default as identity primary key
, dummy varchar2(1) );
insert into demo1 (dummy) select dummy from dual connect by rownum <= 10;
-- 10 rows created.
create table demo2
( id integer generated by default as identity primary key
, dummy varchar2(1) );
insert into demo2 select * from demo1;
-- 10 rows created.
insert into demo2 (dummy) select 'Y' from dual;
-- Fails with ORA-00001: unique constraint (xxx.SYS_C001886275) violated
-- because the identity generator tries to set id = 1, but 1 already exists in the table.
alter table demo2 modify id generated by default as identity start with limit value;
-- Table altered.
insert into demo2 (dummy) select 'Y' from dual;
-- 1 row created.
select * from demo2;
ID DUMMY
--------- -----
1 X
2 X
3 X
4 X
5 X
6 X
7 X
8 X
9 X
10 X
11 Y
此时最好不要再阻止手动输入ID值:
alter table demo2 modify id generated always as identity;
-- Table altered.
insert into demo2 (id, dummy) values (99, 'Z')
-- *
-- ERROR at line 1:
-- with ORA-32795: cannot insert into a generated always identity column