由于违反外键,使用序列生成的 id 的 multi-table 插入失败

multi-table insert using sequence-generated id fails due to foreign key violation

我想将显式数据批量插入到通过外键链接的两个不同表中,在两个表中使用相同的序列生成值。

我正在尝试将 INSERT ALL 指令与由连续的 UNION ALL 语句组成的 WITH 子句一起使用来实现这一点。

只要with子句returns不超过256行,一切正常。一旦我添加另一个 UNION ALL 条目,我就会收到以下错误:

ORA-02291: integrity constraint violated (MY_SCHEMA.FK_TABLE_B_TO_TABLE_A) - parent key not found *Cause: A foreign key value has no matching primary key value. *Action: Delete the foreign key or add a matching primary key.

如果我禁用外键约束,那么一切都正常(即使超过 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。

当使用 multitable 插入时,最好禁用甚至删除所有约束。它有一些重要的限制:

  • 不应使用序列
  • 不保证插入 table 的顺序

因此,即使您插入完全有效的数据,它也可能会因 FK 约束而失败。 无论如何,如果您想快速批量插入数据,您不想浪费时间等待 FK 检查。

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

Oracle 错误 (2891576) 尚未修复。 Oracle 提供解决方法:

Solution(Doc ID 265826.1)

"The order of the tables into which Oracle inserts data is not determinate (guaranteed). Therefore, before issuing a multitable insert statement, you should defer any constraints and disable any triggers that depend on a particular table order for the multitable insert operation."

WORKAROUND:

  1. Disable the foreign key when run such MultiPath Inserts.
  2. Use DEFERRED CONSTRAINTS so the checkout happens only at Commit time.

About Deferred Constraints check Metalink Note:73647.1 "Deferred Constraints Example"