Sql 找不到ORA-02291父密钥,第一个

Sql 找不到ORA-02291父密钥,第一个,sql,oracle,oracle12c,Sql,Oracle,Oracle12c,我的第一个编程程序是Oracle数据库研究生证书程序,该教科书在某些地方对Oracle不友好(它是一本通用数据库教科书)。我不得不重写CREATETABLE命令,我的想法写在下面 这些表是在我的数据库中创建的,我可以在vendor表中插入值;但是,每次我在产品表中插入值时,我都会收到ORA-02291完整性错误 我知道在vendor表中找不到父键,但我不知道为什么。我在这两个表上尝试了列和表约束的组合,但没有任何效果。如果有人能帮我建立这种关系,这样我就可以练习了,那将是非常棒的 CREATE

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

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


我知道在vendor表中找不到父键,但我不知道为什么。我在这两个表上尝试了列和表约束的组合,但没有任何效果。如果有人能帮我建立这种关系,这样我就可以练习了,那将是非常棒的

 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)
 );
编辑
关系设置正确

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

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


如果要删除供应商,请先删除其产品,然后删除供应商,除非您正在使用。

关系设置正确

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

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


如果要删除供应商,请先删除其产品,然后删除供应商,除非您正在使用。

插入语句在哪里??请显示一个请正确格式化您的代码。如果您没有先在供应商中插入一条记录,那么当您尝试在产品中插入“我意识到在供应商表中找不到父项密钥,但我不知道为什么”时,您会出现此错误。您能详细说明此语句吗?是的,我在vendor first@oldprogrammer中插入了请不要将有关问题的重要信息(如插入语句)放入注释中。相反,您应该编辑问题(标签上方有一个可点击的
edit
按钮),并将信息直接添加到问题中。这次我已经做到了。现在-您还可以添加导致错误的INSERT语句吗?这就是插入产品的
语句。谢谢。养成习惯,总是在所有INSERT语句中包含字段列表。不包括字段列表将使您的代码从我参加过的每次代码审查中被踢出,因为当(不是“如果”)一个字段添加到供应商表时,您的语句将立即中断。您的insert语句在哪里??请显示一个请正确格式化您的代码。如果您没有先在供应商中插入一条记录,那么当您尝试在产品中插入“我意识到在供应商表中找不到父项密钥,但我不知道为什么”时,您会出现此错误。您能详细说明此语句吗?是的,我在vendor first@oldprogrammer中插入了请不要将有关问题的重要信息(如插入语句)放入注释中。相反,您应该编辑问题(标签上方有一个可点击的
edit
按钮),并将信息直接添加到问题中。这次我已经做到了。现在-您还可以添加导致错误的INSERT语句吗?这就是插入产品的
语句。谢谢。养成习惯,总是在所有INSERT语句中包含字段列表。不包括字段列表将使您的代码从我参加过的每次代码审查中被踢出,因为当(不是“如果”)一个字段添加到供应商表时,您的声明将立即中断。可以安排约束,以便执行任何订单插入;定义的约束仅在事务完成时进行检查,因此如果在事务中执行了
设置约束所有延迟的
选项,或者如果执行了
更改会话设置所有延迟的约束
以使所有约束在当前会话的延迟模式下起作用,然后插入可以是任何顺序,并且只有在事务提交时才会被验证。一般来说,我支持以正确的顺序执行insert的概念,因为在很少的情况下无法执行insertwork@Olivier感谢您指出V_代码值不匹配。昨晚我想到了这一点,但我不想相信教科书上的说明是错误的!我决定将V_CODE=25595插入到第一个INSERT-into-VENDOR命令(而不是21225)中,我的INSERT-into-PRODUCT命令运行良好。值得一提的是,教科书建议我们在创建产品和供应商表后开始使用前三个INSERT命令,使用不匹配的V_代码不是一个好主意。我想从现在开始,我将从关系一侧的所有INSERT命令开始,然后移到多面。可以安排约束,以便执行任何订单插入;定义的约束仅在事务完成时进行检查,因此如果在事务中执行了
设置约束所有延迟的
选项,或者如果执行了
更改会话设置所有延迟的约束
以使所有约束在当前会话的延迟模式下起作用,然后插入可以是任何顺序,并且只有在事务提交时才会被验证。一般来说,我支持执行的概念
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);