我從導出的csv文件還原Oracle數據庫中的截斷表的數據。但是,我發現主鍵會自動遞增,並且不會從備份文件中插入主鍵約束列的實際值。從備份恢復截斷表
我打算做到以下幾點:1。 下降的主鍵 2.導入表數據 3.在所需的列
這是一個很好的方法添加主鍵約束?如果不是,建議什麼?謝謝。
編輯:經過更多的調查後,我觀察到有一個觸發器產生nextval序列插入到主鍵列。這是困境的根源。因此,按照上述程序不能解決問題。它位於桌子上的觸發器(和/或序列)中。這已解決!
我從導出的csv文件還原Oracle數據庫中的截斷表的數據。但是,我發現主鍵會自動遞增,並且不會從備份文件中插入主鍵約束列的實際值。從備份恢復截斷表
我打算做到以下幾點:1。 下降的主鍵 2.導入表數據 3.在所需的列
這是一個很好的方法添加主鍵約束?如果不是,建議什麼?謝謝。
編輯:經過更多的調查後,我觀察到有一個觸發器產生nextval序列插入到主鍵列。這是困境的根源。因此,按照上述程序不能解決問題。它位於桌子上的觸發器(和/或序列)中。這已解決!
我用下面的過程來解決它:
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;
更容易使用您的.csv作爲外部表,然後去
樣品
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);
編輯:你已經合併了,你可以刪除臨時表中的數據後,結果是舊數據和新數據的上表一起
編輯你提到「在導入過程中,主鍵列不會從文件中插入,但自動遞增」。這隻能在表格上有觸發器時纔會發生,可能是在插入每行之前。禁用觸發器,然後進行導入。提交插入後重新啓用觸發器。
由於@kevinsky。在保留舊桌的使用的同時沒有辦法恢復? – paxmemento 2015-04-02 19:40:47
看到你的更新@kevinsky。看起來像個好主意。現在嘗試。如果有效,將會得到更新。 – paxmemento 2015-04-02 19:44:08
好的。看來我誤解了你,或者你,我。首先,只有一列具有唯一約束。沒有新的數據,只有要恢復的數據。在導入期間,主鍵列不會從文件中插入,而是自動遞增。我的意圖是將數據插入文件中的唯一列。基本上我想讓數據庫引擎相信我的插入到這個列。您的方法@kevinsky無法解決我的問題。 – paxmemento 2015-04-02 19:52:04