【问题标题】:ORA-02291 parent key not found, firstORA-02291 未找到父键,首先
【发布时间】:2017-12-24 16:45:37
【问题描述】:

我的第一个编程程序是 Oracle 数据库研究生证书程序,并且该教科书在某些地方对 Oracle 不友好(它是通用数据库教科书)。我不得不重写 CREATE 表命令,我想出的内容写在下面。

这些表是在我的数据库中创建的,我可以将值插入到 vendor 表中;但是,每次我将值插入产品表时,我都会收到ORA-02291 integrity error

我意识到在供应商表中找不到父键,但我不知道为什么。我已经在两个表上尝试了列和表约束的组合,但没有任何效果。如果有人可以帮助我建立这种关系,以便我可以练习,那就太好了!

 CREATE TABLE VENDOR(

 V_CODE     INTEGER         NOT NULL    CONSTRAINT VENDOR_P_K  PRIMARY KEY,
 V_NAME     VARCHAR(35)     NOT NULL,
 V_CONTACT  VARCHAR(25)     NOT NULL,
 V_AREACODE CHAR(3)         NOT NULL,
 V_PHONE    CHAR(8)         NOT NULL,
 V_STATE    CHAR(2)         NOT NULL,
 V_ORDER    CHAR(1)         NOT NULL
 );

----------------------------------------------------------------------------
CREATE TABLE PRODUCT(

 P_CODE     VARCHAR2(10)            CONSTRAINT PRODUCT_P_CODE_PK  PRIMARY KEY,
 P_DESCRIPT VARCHAR2(35)            NOT NULL,
 P_INDATE   DATE                    NOT NULL,
 P_QOH      NUMBER                  NOT NULL,
 P_MIN      NUMBER                  NOT NULL,
 P_PRICE    NUMBER(8,2)             NOT NULL,
 P_DISCOUNT NUMBER(5,2)             NOT NULL,
 V_CODE     INTEGER                 NOT NULL,
 CONSTRAINT V_CODE_FK               FOREIGN KEY (V_CODE) REFERENCES VENDOR (V_CODE)
 );

编辑

INSERT INTO VENDOR 2
  VALUES (21225, 'Bryson, Inc.', 'Smithson', '615','223-3234','TN','Y');

INSERT INTO VENDOR 2
  VALUES (21226,'Superloo, Inc.','Flushing','904','215-8995','FL','N');

INSERT INTO PRODUCT 2 
   VALUES ('11QER/31','Power painter, 15 psi., 3-nozzle','03-Nov-13',8,5,109.99,0.00,25595);

【问题讨论】:

  • 您的插入语句在哪里?请显示minimal reproducible example 请正确格式化您的代码。如果您没有在 VENDOR 中插入第一条记录,那么在尝试插入产品时会出现此错误
  • “我意识到在供应商表中找不到父键,但我不知道为什么” - 你能详细说明一下这个陈述吗?。
  • 是的,我首先插入了供应商@OldProgrammer
  • 请不要将有关问题的重要信息(例如您的 INSERT 语句)放入 cmets。相反,您应该编辑问题(标签上方有一个可点击的edit 按钮)并将信息直接添加到问题中。这次我做到了。现在 - 您能否也请添加导致错误的 INSERT 语句?那就是INSERT INTO PRODUCT 声明。谢谢。
  • 养成总是的习惯,包括包含所有 INSERT 语句的字段列表。不包括字段列表将使您的代码从我参与的每个代码审查中被踢出,因为当(不是“如果”)字段添加到 VENDOR 表时,您的语句将立即中断。

标签: sql oracle oracle12c


【解决方案1】:

关系设置正确。

您只能在主表中插入与主键值匹配的外键值。在您的示例中,您使用V_CODE = 25595 插入产品,但您从未使用此V_CODE 插入供应商。

也许您打算稍后插入供应商。这不起作用,因为数据库正在为每个命令强制执行约束。因此,请先插入供应商,然后再添加他的产品。

如果您要删除供应商,请先删除其产品,然后再删除供应商,除非您使用的是Foreign Keys with Cascade Delete

【讨论】:

  • 可以安排约束,以便进行任意顺序的插入;延迟约束仅在事务完成时检查,因此如果在事务中执行了SET CONSTRAINTS ALL DEFERRED 选项,或者如果执行了ALTER SESSION SET ALL CONSTRAINTS DEFERRED 以使当前会话的所有约束都以延迟模式运行,则插入可以按任何顺序进行并且只会在事务提交时进行验证。一般来说,我支持以正确的顺序执行插入的概念,因为在少数情况下它不能工作
  • @Olivier 感谢您指出 V_CODE 值不匹配。昨晚我想到了这个,但我不想相信教科书的说明是错误的!我决定将 V_CODE=25595 插入第一个 INSERT INTO VENDOR 命令(而不是 21225),并且我的 INSERT INTO PRODUCT 命令运行良好。对于它的价值,前三个 INSERT 命令是教科书建议我们在创建产品和供应商表后开始使用的,使用不匹配的 V_CODE 不是一个好主意。
  • 我想从现在开始,我将从关系一侧的所有 INSERT 开始,然后转到多侧。
猜你喜欢
  • 2016-10-08
  • 1970-01-01
  • 2016-03-12
  • 1970-01-01
  • 2020-07-19
  • 2018-04-18
  • 2014-06-12
  • 1970-01-01
  • 2018-05-23
相关资源
最近更新 更多