2015-04-02 90 views
0

我从导出的csv文件还原Oracle数据库中的截断表的数据。但是,我发现主键会自动递增,并且不会从备份文件中插入主键约束列的实际值。从备份恢复截断表

我打算做到以下几点:1。 下降的主键 2.导入表数据 3.在所需的列

这是一个很好的方法添加主键约束?如果不是,建议什么?谢谢。

编辑:经过更多的调查后,我观察到有一个触发器产生nextval序列插入到主键列。这是困境的根源。因此,按照上述程序不能解决问题。它位于桌子上的触发器(和/或序列)中。这已解决!

回答

0

我用下面的过程来解决它:

drop trigger trigger_name 

进口表数据到目标表

drop sequence sequence_name 

CREATE SEQUENCE SEQ_NAME INCREMENT BY 1 START WITH start_index_for_next_val MAXVALUE max_val MINVALUE 1 NOCYCLECACHE 20 NOORDER 

CREATE OR REPLACE TRIGGER "schema_name"."trigger_name" 

before insert on target_table 
for each row 

begin 
    select seq_name.nextval 
    into :new.unique_column_name 
    from dual; 
end; 
1

更容易使用您的.csv作为外部表,然后去

  • 创建表your_table_temp如SELECT * FROM外部表
  • 检查在新的临时表中的数据,以确保您知道什么范围主键是本
  • herehere

    做合并到新表

样品

CREATE TABLE countries_ext (
    country_code  VARCHAR2(5), 
    country_name  VARCHAR2(50), 
    country_language VARCHAR2(50) 
) 
ORGANIZATION EXTERNAL (
    TYPE ORACLE_LOADER 
    DEFAULT DIRECTORY ext_tab_data 
    ACCESS PARAMETERS (
    RECORDS DELIMITED BY NEWLINE 
    FIELDS TERMINATED BY ',' 
    MISSING FIELD VALUES ARE NULL 
    (
     country_code  CHAR(5), 
     country_name  CHAR(50), 
     country_language CHAR(50) 
    ) 
) 
    LOCATION ('Countries1.txt','Countries2.txt') 
) 
PARALLEL 5 
REJECT LIMIT UNLIMITED; 

和合并

MERGE INTO employees e 
    USING hr_records h 
    ON (e.id = h.emp_id) 
    WHEN MATCHED THEN 
    UPDATE SET e.address = h.address 
    WHEN NOT MATCHED THEN 
    INSERT (id, address) 
    VALUES (h.emp_id, h.address); 

编辑:你已经合并了,你可以删除临时表中的数据后,结果是旧数据和新数据的上表一起

编辑你提到“在导入过程中,主键列不会从文件中插入,但自动递增”。这只能在表格上有触发器时才会发生,可能是在插入每行之前。禁用触发器,然后进行导入。提交插入后重新启用触发器。

+0

由于@kevinsky。在保留旧桌的使用的同时没有办法恢复? – paxmemento 2015-04-02 19:40:47

+0

看到你的更新@kevinsky。看起来像个好主意。现在尝试。如果有效,将会得到更新。 – paxmemento 2015-04-02 19:44:08

+0

好的。看来我误解了你,或者你,我。首先,只有一列具有唯一约束。没有新的数据,只有要恢复的数据。在导入期间,主键列不会从文件中插入,而是自动递增。我的意图是将数据插入文件中的唯一列。基本上我想让数据库引擎相信我的插入到这个列。您的方法@kevinsky无法解决我的问题。 – paxmemento 2015-04-02 19:52:04