2016-05-04 48 views
0

我想通過兩個表中的相同序列生成值將顯式數據批量插入由外鍵鏈接的兩個不同表中。多表插入使用序列生成的id由於外鍵違例而失敗

我正在嘗試使用INSERT ALL指令和由連續的UNION ALL語句組成的WITH子句來實現這一點。

只要with子句返回不超過256行,一切正常。當我再添UNION ALL條目,我發現了以下錯誤:

ORA-02291:完整性約束違反 (MY_SCHEMA.FK_TABLE_B_TO_TABLE_A) - 父項未找到 *原因:外鍵值沒有匹配的主鍵值。 *操作:刪除外鍵或添加匹配的主鍵。

如果我禁用外鍵約束,然後再次一切工作正常(即使有超過256行)。

我的指令是這樣的:

insert all 
    into MY_SCHEMA.TABLE_A (ID, COLUMN_1, COLUMN_2) 
    values (MY_SCHEMA.MY_SEQUENCE.nextval, COLUMN_1, COLUMN_2) 
    into MY_SCHEMA.TABLE_B (ID, COLUMN_3) 
    values (MY_SCHEMA.MY_SEQUENCE.nextval, COLUMN_3) 

    with input_data as (
    select 11 COLUMN_1, 12 COLUMN_2, 13 COLUMN_3 
     UNION ALL 
    select 21 COLUMN_1, 22 COLUMN_2, 23 COLUMN_3 
     UNION ALL 
     ... 
     UNION ALL 
    select 31 COLUMN_1, 32 COLUMN_2, 33 COLUMN_3 

) 
    select * from input_data; 

是否有數據的,這樣的指令可以處理量一定的侷限性?還是我錯過了別的?

我正在使用Oracle 11g和SQLDeveloper。

+0

你失去了一些東西。該錯誤是一個數據驗證錯誤,表示沒有滿足外鍵條件。它與數據的大小無關。一個可能的罪魁禍首是您要插入的附加行具有重複值。 –

+0

謝謝您的輸入,那麼您如何解釋禁用FK會導致錯誤消失(所有數據正確插入,我應該提及)? –

+0

因此,當您禁用FK並且使用相同的union all時,插入所有(超過256)行並且表具有相同的ID? – artm

回答

3

使用多區域插入時,最好禁用或甚至刪除所有約束。它有一些重要的限制:

  • 序列不應該被用來
  • 插入的順序爲表中沒有guarantied

如果插入完全有效的數據所以甚至,它可能會失敗的FK約束。 無論如何,如果你想快速批量插入你的數據,你不想浪費等待FK檢查的時間。

更新:可能的重複:https://dba.stackexchange.com/questions/23384/using-multi-table-insert-for-parent-and-child-table

Oracle的錯誤(2891576)尚未確定。 Oracle提供瞭解決方法:

解決方案(文檔ID 265826.1)

「到甲骨文插入數據的表的順序不 確定的(保證)。因此,發出多表 插入語句之前,你應推遲任何約束並禁用任何取決於多個插入操作的特定表格順序的觸發器。「

解決方法:

  1. 運行這種多路插入時禁用外鍵。
  2. 使用DEFERRED CONSTRAINTS,以便僅在提交時發生檢出。

有關延遲約束檢查Metalink說明:73647.1 「遞延 約束示例」

+0

_sequences是什麼意思不能使用_?我知道它們不能用於子查詢中(請參見[Oracle官方文檔](https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9014.htm#i2095116)),但在我的示例I使用序列,它是一個多用途插入... –

+0

我也無法在[官方文檔]中找到任何地方(https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9014.htm#i2095116 )關於INTO子句的執行順序有些未定義 –

+0

我認爲這些限制是我在DatawareHousing指南中的某處讀到的。這裏有一些其他的限制:http://allthingsoracle.com/multi-table-insert-statements-in-oracle/ – ibre5041

相關問題