0

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

我正在尝试使用 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。

4

1 回答 1

3

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

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

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

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

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

解决方案(文档 ID 265826.1)

“Oracle 插入数据的表的顺序是不确定的(保证)。因此,在发出多表插入语句之前,您应该推迟任何约束并禁用任何依赖于特定表顺序的触发器进行多表插入操作。”

解决方法:

  1. 运行此类多路径插入时禁用外键。
  2. 使用 DEFERRED CONSTRAINTS 以便签出仅在提交时发生。

关于延迟约束检查 Metalink Note:73647.1 "Deferred Constraints Example"

于 2016-05-04T11:09:43.193 回答