2011-11-01 26 views
1

我有一個表,其中包含以下列,我試圖按如下方式拆分它。我如何寫一個遷移腳本在Oracle用於拆分不同模式表之間的行的遷移腳本

以下改造

來源:

create table abc (id pk, col1, col2, col3, col4, col5, col6) 

目標:

create table def (id pk, col1, col2) 
create table ghi (id pk, def_id fk, value) 

鑑於這種起點......

insert into table abc values (1, 1, 2, 3, 4, 5, 6) 
insert into table abc values (2, 7, 8, 9, 10, 11, 12) 

。 ..帖子翻譯後的數據映射如下

def contains (1, 1, 2) 
ghi contains (1, 1, 3) 
ghi contains (2, 1, 4) 
ghi contains (3, 1, 5) 
ghi contains (4, 1, 6) 

def contains (2, 7, 8) 
ghi contains (5, 2, 9) 
ghi contains (6, 2, 10) 
ghi contains (7, 2, 11) 
ghi contains (8, 2, 12) 

最重要的限制是,我要生成排在ghi只有在abc相應的列值not null

+0

感謝您提供接近正確的SQL的東西,以便我們能夠理解您的問題。但是,對於完整標記,您應該提供可運行的DDL和DML,而不是需要編輯的僞SQL。 – APC

回答

1

我認爲要做到這一點,最簡單的方法是從源表中的兩個選擇。第一個是不在話下:

insert into def 
select id, col1, col2 from abc 

第二個使用INSERT ALL語法:

INSERT ALL 
    WHEN col3 is not null THEN 
     INTO ghi values (some_seq.nextval, id, col3) 
    WHEN col4 is not null THEN 
     INTO ghi values (some_seq.nextval, id, col4) 
    WHEN col5 is not null THEN 
     INTO ghi values (some_seq.nextval, id, col5) 
    WHEN col6 is not null THEN 
     INTO ghi values (some_seq.nextval, id, col6) 
    SELECT id, col3, col4, col5, col6 
     FROM abc; 

注意,我假設一個序列SOME_SEQ作爲GHI主鍵值的來源。你可能想要有其他的機制。


嗯,已經運行我的代碼我得到這樣的結果:

SQL> select * from ghi; 

     ID  DEF_ID  VALUE 
---------- ---------- ---------- 
     1   1   3 
     2   2   9 
     1   1   4 
     2   2   10 
     1   1   5 
     2   2   11 
     1   1   6 
     2   2   12 

8 rows selected. 

SQL> 

正如你所看到的,SOME_SEQ只增加了在ABC 在GHI的8列兩行。這很有道理,因爲在同一個語句中對NEXTVAL的兩次調用返回相同的值,但我希望每個INSERT都會單獨計數。

唉。這意味着你的遷移你不能強制GHI上的主鍵,直到你已經填充它。所以

  1. 禁用主鍵(或創建沒有一個表)。
  2. 填入數據從ABC
  3. 填充主鍵列(以任何方式)
  4. 使主鍵約束

或者你需要找到一些其他的方式來填充GHI ID列。

+0

「INSERT ALL WHEN」爲+1 – pilcrow

+0

我無法禁用主鍵,我會嘗試其他選項。 – Jason

+0

不能禁用主鍵是一個不尋常的限制。通常情況下,數據遷移是一個TAZ,其中規則可以在數據陷入時暫停,前提是所有數據完整性約束都已到位並且在練習結束時有效。 – APC