如何使用最高父表的索引将记录及其所有相关记录从一个数据库复制到另一个数据库?

问题描述 投票:0回答:1

我使用的数据库是Informix,版本是9.4。

我有一个场景,我试图将一些特定的记录从一个数据库迁移到另一个数据库。下面是我想做的一个例子。

比方说,我在数据库D1中有三张表A、B、C。我需要把这三张表的一些记录复制到数据库D2中。

下面是A、B、C之间的关系。

  • A - 主键为a1的母体
  • B----A的子项,主键为b1,参考键为a1。

我想从数据库D1中移动一些记录,具体条件是a1='某物'。 除了A,我还需要从B和C中复制与A直接相关(A<->B)或间接相关(A<->C通过B)的记录。

最简单可靠的复制数据的方法是什么?

顺便说一下。这是个一次性的工作,不是连续的工作。

sql informix
1个回答
1
投票

从表面上看,如果要传输的数据量足够小,那么你可以使用。

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,那么你就有问题了。 那么到底是拆分交易最好,还是选择unloadreload,很难决定。 总的来说,如果需要的空间太大,unloadreload可能更好。

© www.soinside.com 2019 - 2024. All rights reserved.