簡體   English   中英

如何使用最高父表的索引將記錄及其所有相關記錄從一個數據庫復制到另一個數據庫?

[英]How can I copy records and all its related records from one database to another database using the index of the highest parent table?

我使用的數據庫是 Informix; 版本是 9.4。

我有一個場景,我試圖將一些特定記錄從一個數據庫遷移到另一個數據庫。 這是我正在嘗試做的一個例子,

假設我在數據庫 D1 中有三個表 A、B、C。 我需要將這三個表中的一些記錄復制到數據庫 D2 中。

A、B、C之間的關系如下,

  • A - 具有主鍵 a1 的父級
  • B - 具有主鍵 b1 和參考鍵 a1 的 A 的子級
  • C - 具有主鍵 c1 和參考鍵 b1 的 B 的子級

我想從具有特定條件 a1 = 'something' 的數據庫 D1 中移動一些記錄。 與 A 一起,我需要從 B 和 C 復制與 A 直接(A<->B)或間接(A<->C 到 B)相關的記錄。

復制數據最簡單、最可靠的方法是什么?

供參考。 這是一次性的工作,而不是連續的工作。

從表面上看,如果要傳輸的數據量足夠小,那么您可以使用:

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的記錄要傳輸(因為a1A的主鍵)。

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 進行卸載/重新加載很難決定。 總的來說,如果所需的空間太大,卸載/重新加載可能會更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM