【发布时间】:2016-05-04 10:46:22
【问题描述】:
我想在两个表中使用相同的序列生成值将显式数据批量插入到由外键链接的两个不同表中。
我正在尝试使用 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。
【问题讨论】:
-
你错过了一些东西。该错误是数据验证错误,表示未满足外键条件。它与数据的大小无关。一个可能的罪魁祸首是您要插入的其他行具有重复值。
-
感谢您的意见,那么您如何解释禁用 FK 会使错误消失(我应该提到的所有数据都已正确插入)?
-
那么当你禁用 FK 并使用相同的 union all 时,所有(超过 256 个)行都被插入并且表具有相同的 ID?
-
正确。会不会是插入顺序不确定?
标签: sql oracle sql-insert bulkinsert multi-table