2010-02-26 96 views
3

我有一個平面MAIN_TABLE。我需要將這個表中的記錄插入到多個表中。一次插入一條記錄到表格中的多個表格

例如。

MAIN_TABLE 
col1, col2, col3, col4, col5 

PARENT1_TABLE 
PT1_ID(PK), col1,col2 

PARENT2_TABLE 
PT2_ID(PK), col3,col4 

PARENT2_CHILD_TABLE 
P2C_ID(PK), PT2_ID(FK), col5, col6 

等。

目標是,我必須將記錄從平面MAIN_TABLE移動到上面定義的關係結構。

任何幫助將不勝感激?

謝謝

+1

你有這個標記爲兩個Oracle,SQL-Server和MySQL ,您需要使用相同的解決方案來支持所有平臺? – 2010-02-26 01:10:59

+0

什麼阻止您運行「插入...選擇...」4次? – Martin 2010-02-26 07:41:28

回答

2

如果這是在SQL Server中,你可以創建你MAIN_TABLE的視圖,然後寫在視圖中INSTEAD OF INSERT觸發。這樣,當您的MAIN_TABLE視圖中有一條記錄時,您的觸發器可以將其解析到您的子表中。 Link goodness

+0

MAIN_TABLE已經有數據。我需要將這些數據移動到關係結構表中 – niceApp 2010-02-26 01:31:28

+2

哇,從來沒有聽說過'INSTEAD OF TRIGGER'。多麼困擾同事的好方法! – MusiGenesis 2010-02-26 01:50:26

+0

您可以使用相同模式創建代理表,創建視圖並在其上創建觸發器,然後將BCP cmd與批量插入一起使用。以下是一些其他選項:http://www.databasejournal.com/features/mssql/article.php/3507171/Transferring-Data-from-One-Table-to-Another.htm – davecoulter 2010-02-26 02:07:43

7

在Oracle中你可以做Multi-Table inserts。 創建一個虛擬錯誤記錄表

create global temporary table err_dump 
    (ORA_ERR_NUMBER$ NUMBER, 
    ORA_ERR_MESG$  VARCHAR2(2000), 
    ORA_ERR_ROWID$ UROWID(4000), 
    ORA_ERR_OPTYP$ VARCHAR2(2), 
    ORA_ERR_TAG$  VARCHAR2(2000)); 

然後加上(COL1,COL2)爲parent2 parent1和(COL3,COL4)的唯一關鍵。 使用多表插入來加載到兩個父表中。 LOG ERRORS INTO子句將意味着任何進入父表的重複項都將被踢出。

INSERT ALL 
     INTO parent1_table (pt1_id, col1,col2) 
     VALUES (rn, col1,col2) 
     LOG ERRORS INTO err_dump REJECT LIMIT 99999999 
     INTO parent2_table (pt2_id, col3, col4) 
     VALUES (rn, col3, col4) 
     LOG ERRORS INTO err_dump REJECT LIMIT 99999999 
    SELECT rownum rn, col1, col2, col3, col4 
    FROM MAIN_TABLE; 

最後,執行從主一個選擇,加入到parent1_table和parent2_table來獲得新的PK,這是一個簡單的插入到PARENT2_CHILD_TABLE