【发布时间】:2019-11-25 17:38:06
【问题描述】:
我从 3 个依赖表中创建了一个查询:
汽车零件(id, name, value);
car_model(id, name,price);
part_and_model(car_model_id, car_part_id)
我从值列表中获取我的汽车模型,对于 car_id,我使用序列作为增量。
我的查询中有所有需要的字段,但现在我想同时将数据插入 car_parts 和 part_and_model。我在提交插入时创建了两个进程(第一个用于 car_parts(fk),第二个用于 part_and_model)。当我运行它时,我得到了这个错误并且没有数据被插入到表中:
ORA-02291:违反完整性约束 (PRACTICE.FK_CAR_PART_car_part) - 未找到父密钥
当我删除第二个进程时,数据被正确插入到 car_parts 表中。为什么会这样?第二个过程在第一个之前执行吗?我还缺少什么?
项目 P8_CAR_MODEL = LOV; item P8_ID=>sequence: SELECT CP_SEK.NEXTVAL FROM DUAL;
进程1:插入CAR_PARTS(CP_ID,CP_NAME,CP_PRICE) VALUES (:P8_ID, :P8_NAME, :P8_PRICE);
process2: 插入part_and_model(PART_ID, MODEL_ID) 值(:P8_ID,:P8_CAR_MODEL);
编辑:
我设法插入到 car_parts 表中,但错误仍然说找不到父级(即使)它在表中,所以它必须是序列...... 这是我的代码: 过程1: 开始 选择 PART_SEK.NEXTVAL INTO :P8_ID from dual;
插入 car_parts(id,name,value) VALUES (:P8_ID, :P8_NAME, :P8_PRICE); 结束;
进程2:
插入part_and_model(car_model_id, car_part_id) 值(:P8_MODEL,:P8_ID);
编辑2: 当我在第二个过程中使用 PART_SEK.currval 而不是 p8_id 时,它可以工作 再次感谢大家的宝贵时间。
【问题讨论】:
-
正如 littlefoot 所说,在一个进程中完成两个插入。但我想补充一条评论。如果您真的不需要在插入之前查看项目 P8_ID(您很可能不需要),您应该在插入之前的过程中声明它并为其分配其值。因为如果它是项目的来源,那么每次加载时,都会触发序列。因此,您的数据库将在 CP_ID 中出现间隙(值会像 1、3、4、8、13,..)这并没有真正破坏任何东西,如果它们是完全连续的,那就更好了。
标签: sql oracle oracle-apex