2015-04-02 58 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