Как скопировать все ограничения и данные из одной схемы в другую в Oracle - PullRequest
0 голосов
/ 26 декабря 2018

Я использую жабу для оракула 12c.Мне нужно скопировать таблицу и данные (40M) из одного shcema в другой (Prod для тестирования).Однако существует уникальный ключ (не PK для этой таблицы) с именем record_Id col, в котором есть что-то вроде этого 3.000 ******* 19E15.Около 2M строк имеют одинаковые номера (я считаю, потому что очень большое количество), которые являются уникальными в Prod.Когда я пытаюсь скопировать фиолетовый, это уникальный ключ этого цвета.Я использую функцию жабы «экспортировать данные в другую схему» для копирования данных.

когда я выполняю запрос в продукт

 select count(*) from table_name 

ИЛИ

select count(distinct(record_id) from table_name

Оба запроса дают одинаковое количество данных.

У меня нет разрешения DBA.Как мне скопировать все данные, не нарушая уникальный ключ таблицы.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

В Oracle вы можете использовать для этого MERGE запрос .

Следующий запрос выполняется для каждой строки данных следующим образом:

  • , еслиисточник record_id еще не существует в целевой таблице, новая запись вставлена ​​
  • иначе, существующая запись обновлена ​​ со значениями источника

Ради примера я предположил, что в таблице есть еще два столбца: column1 и column2.

MERGE INTO target_table t1
USING (SELECT * from source_table t2)
ON (t1.record_id = t2.record_id)
WHEN MATCHED THEN UPDATE SET
    t1.column1 = t2.column1,
    t1.column2 = t2.column2
WHEN NOT MATCHED THEN INSERT
    (record_id, column1, column2) VALUES (t2.record_id, t2.column1, t2.column2)
0 голосов
/ 26 декабря 2018

Вы можете использовать UPSERT для принятия решения ВСТАВИТЬ или ОБНОВИТЬ или вы можете написать небольшую процедуру для этого.

вы можете использовать NOT EXISTS, но ваши данные велики и могут быть неэффективными с точки зрения ресурсов..

insert into prod_tab 
  select * from other_tab t1 where NOT exists (
     select 1 from prod_tab t2 where t1.id = t2.id
  ); 
...