使用IDENTITY列在Oracle中的环境中导出/导入数据

时间:2018-02-21 11:30:27

标签: sql oracle insert export identity

我在列上使用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中继续序列?

1 个答案:

答案 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