我正在从导出的csv文件中恢复Oracle数据库中截断表的数据。但是,我发现主键自动递增,并且不会从备份文件中插入主键约束列的实际值。
我打算做以下事情: 1.放下主键 2.导入表数据 3.在所需列上添加主键约束
这是一个好方法吗?如果没有,推荐什么?感谢。
编辑:经过更多调查后,我发现有一个触发器可以在要插入主键列的序列上生成nextval。这是困境的根源。因此,按照上述程序不能解决问题。它位于表格的触发器(和/或序列)中。这解决了!
答案 0 :(得分:1)
更容易将.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);
编辑:合并数据后,您可以删除临时表,结果就是上一个表格中包含旧数据和新数据
编辑你提及"在导入期间,主键列不会从文件中插入,而是自动递增"。这种情况只有在表上有触发器时才会发生,可能是在每行插入之前。禁用触发器,然后执行导入。提交插入后重新启用触发器。
答案 1 :(得分: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;