从备份还原截断的表

时间:2015-04-02 19:30:12

标签: sql database oracle import constraints

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

我打算做以下事情: 1.放下主键 2.导入表数据 3.在所需列上添加主键约束

这是一个好方法吗?如果没有,推荐什么?感谢。

编辑:经过更多调查后,我发现有一个触发器可以在要插入主键列的序列上生成nextval。这是困境的根源。因此,按照上述程序不能解决问题。它位于表格的触发器(和/或序列)中。这解决了!

2 个答案:

答案 0 :(得分:1)

更容易将.csv用作外部表,然后转到

  • 将table your_table_temp创建为select * from external table
  • 检查新临时表中的数据,以确保您知道存在哪些主键范围
  • 合并到新表

来自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);

编辑:合并数据后,您可以删除临时表,结果就是上一个表格中包含旧数据和新数据

编辑你提及"在导入期间,主键列不会从文件中插入,而是自动递增"。这种情况只有在表上有触发器时才会发生,可能是在每行插入之前。禁用触发器,然后执行导入。提交插入后重新启用触发器。

答案 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;