由于违反外键,使用序列生成的 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:
- Disable the foreign key when run such MultiPath Inserts.
- Use DEFERRED CONSTRAINTS so the checkout happens only at Commit time.
About Deferred Constraints check Metalink Note:73647.1 "Deferred
Constraints Example"
我想将显式数据批量插入到通过外键链接的两个不同表中,在两个表中使用相同的序列生成值。
我正在尝试将 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:
- Disable the foreign key when run such MultiPath Inserts.
- Use DEFERRED CONSTRAINTS so the checkout happens only at Commit time.
About Deferred Constraints check Metalink Note:73647.1 "Deferred Constraints Example"