文章主要描述的是正確快速的 import 或是 load 多個 DB2 主從表的實際操作步驟,假如你對import 或是 load 多個 DB2 主從表的實際操作步驟,有興趣了解的話,你就可以浏覽以下的文章了。
問題
在數據庫日常維護中,數據庫管理員有時候需要在不同的數據庫間移動大量的數據,而這些數據在我們的業務中具有主從父子)表的關系,那麼在我們導出、導入或裝入的時候,有時會遇到SQL0530N ,SQL0668N 的報錯信息,那麼我們應該如何避免這些錯誤,以確保這些操作能正確、快速的完成呢?
解答
假設我們創建了如下兩個DB2 主從表:
- CREATE TABLE PARENTT(ID INT NOT NULL,
- NAME CHAR(20) NOT NULL,
- CONSTRAINT P_PT PRIMARY KEY(ID))
- CREATE TABLE CHILDT (ID INT NOT NULL,
- CNAME CHAR(40) NOT NULL,
- PID INT,
- CONSTRAINT P_CT PRIMARY KEY(ID),
- CONSTRAINT F_CT FOREIGN KEY (PID) REFERENCES PARENTT (ID) ON DELETE CASCADE)
如果主表 PARENTT 中未導入數據,那麼我們在向從表 CHILDT 中使用 IMPORT 導入數據時會遇到錯誤 SQL0530N ,之所以有這個錯誤,是因為在IMPORT外鍵約束需要檢查參照完整性,如果主表中沒有相關記錄,是不允許導入該數據的。
- db2 "import from child.del of del insert into childt"
- SQL0530N FOREIGN KEY "HUANGDK.CHILDT.F_CT"
的插入或更新值不等於父表的任何父鍵值。
若使用 LOAD 方式可以裝入數據,因為LOAD設計為在裝入時忽略約束檢查,但是在查詢數據時,會遇到SQL0668N RC=1
- db2 "load from child.del of del insert into childt"
- db2 "select * from childt"
SQL0668N 不允許對表 " HUANGDK.CHILDT" 執行操作,原因碼 "1"。
原因碼"1"表示:表 "HUANGDK.CHILDT"處於“檢查暫掛”狀態。未強制檢查從表" HUANGDK.CHILDT"的參照完整性,並且表的內容可能是無效的。如果從屬表處於檢查暫掛狀態,則對於未處於檢查暫掛的父表或基礎表的操作也可能接收到此錯誤。
在裝入主表 PARENTT 的數據後,可以使用如下語句使表恢復到正常狀態:
- db2 set integrity for huangdk.childt immediate checked
對於具有大量DB2 主從表需要裝入的操作,上述語句會浪費數據庫管理員大量的時間,並且如果在主表數據未裝入前執行上述語句,同樣會遇到 SQL0530N 的報錯。
其實,如果我們先裝入或導入主表數據,那麼就不會遇到上述錯誤,也不需要執行set integrity語句大大簡化了操作。我們從系統視圖SYSCAT.REFERENCES可以找到表的主從關系,方法是使用如下 SQL 語句:
db2 "select substr(REFTABSCHEMA,1,20) as 主表模式,substr(REFTABNAME,1,30) as 主表,substr(TABSCHEMA,1,20) as 從表模式,substr(TABNAME,1,30) as 從表 from SYSCAT.REFERENCES"
主表模式
主表
從表模式
從表
- ASN_DOWN_TC_M6101 IBMQREP_SENDQUEUES ASN_DOWN_TC_M6101 IBMQREP_SUBS
- ASN_DOWN_TC_M6101 IBMQREP_SUBS ASN_DOWN_TC_M6101 IBMQREP_SRC_COLS
- HDK PARENTT HDK CHILDT
以上的相關內容就是對何正確快速地 import 或 load 多個 DB2 主從表的介紹,望你能有所收獲。