我从导出的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