[英]COPY records from table on one database to another Oracle SQL Developer
[英]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之間的關系如下,
我想從具有特定條件 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
的記錄要傳輸(因為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 進行卸載/重新加載很難決定。 總的來說,如果所需的空間太大,卸載/重新加載可能會更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.