Как я могу скопировать записи и все связанные с ними записи из одной базы данных в другую базу данных, используя индекс самой высокой родительской таблицы? - PullRequest
1 голос
/ 24 апреля 2020

База данных, которую я использую, - Informix; версия 9.4.

У меня есть сценарий, в котором я пытаюсь перенести определенные записи c из одной базы данных в другую. Вот пример того, что я пытаюсь сделать,

Допустим, у меня есть три таблицы A, B, C в базе данных D1. Мне нужно скопировать некоторые записи из этих трех таблиц в базу данных D2.

Ниже приведены отношения между A, B, C,

  • A - родитель с первичным ключом a1
  • B - дочерний элемент A с первичным ключом b1 и ссылочным ключом a1
  • C - дочерний элемент B с первичным ключом c1 и ссылочным ключом b1

Я хочу переместить некоторые записи из базы данных D1 с указанным c условием a1 = 'что-то'. Наряду с A мне нужно скопировать записи из B и C, которые связаны с A напрямую (A <-> B) или косвенно (A <-> C до B).

Что такое самый простой и надежный способ копирования данных?

К вашему сведению. Это разовая, а не непрерывная работа.

1 Ответ

1 голос
/ 25 апреля 2020

На первый взгляд, если объем передаваемых данных достаточно мал, вы можете использовать:

BEGIN WORK;
INSERT INTO D2:A
    SELECT * FROM A WHERE a1 = 'something';
INSERT INTO D2:B
    SELECT B.* FROM B JOIN A ON B.a1 = A.a1
     WHERE A.a1 = 'something';
INSERT INTO D2:C
    SELECT C.*
      FROM C
      JOIN B ON C.b1 = B.b1
      JOIN A ON B.a1 = A.a1
     WHERE A.a1 = 'something';
COMMIT WORK;

Можно упростить вещи, если условие на A на самом деле так просто, как a1 = 'something', так что есть только одна запись из A для передачи (поскольку a1 является первичным ключом A).

BEGIN WORK;
INSERT INTO D2:A
    SELECT * FROM A WHERE A.a1 = 'something';
INSERT INTO D2:B SELECT B.* FROM B
     WHERE B.a1 = 'something';
INSERT INTO D2:C
    SELECT C.*
      FROM C
      JOIN B ON C.b1 = B.b1
     WHERE B.a1 = 'something';
COMMIT WORK;

Это позволяет избежать присоединений к таблице. A.

Если объем данных делает это нелепым, вы, вероятно, застряли с чем-то вроде выгрузки и перезагрузки данных. Было бы разумно заблокировать таблицы в режиме общего доступа при их выгрузке.

Какой объем делает операцию тройной вставки нелепой? Сложно ответить, но если для передаваемых данных требуется больше места для логического журнала, чем у вас на сервере с D2, у вас проблемы. Трудно решить, будет ли тогда лучше разделять транзакции или использовать go для выгрузки / перезагрузки. В целом, выгрузка / перезагрузка, вероятно, лучше, если требуемое пространство слишком велико.

...