错误报告:SQL错误:外键值没有匹配的主键值。完全莫名其妙

时间:2013-02-21 15:51:30

标签: sql database oracle

我可以肯定地说我是SQL的新手,因此在编写将数据插入表格的代码时,我收到了错误报告,我似乎无法理解它的含义,因此我希望有人出来也许能够告诉我我犯了什么愚蠢的错误并消除了很多压力^。^

这是我得到的错误代码:

  

错误报告:   SQL错误:ORA-02291:违反了完整性约束(H.VENDOR_ID_FK) - 未找到父键   02291. 00000 - “违反完整性约束(%s。%s) - 未找到父密钥”   *原因:外键值没有匹配的主键值。   *操作:删除外键或添加匹配的主键。

提前致谢!

1 个答案:

答案 0 :(得分:1)

如果我运行所有这些,我在此之前会遇到几个错误,我现在将跳过这个错误...第一个反对这个FK的错误似乎是:

INSERT INTO parts_order VALUES
        (2
        ,2
        ,95115995
        ,'Delivered'
        ,'04/dec/2012'
        ,'01/jan/2013'
        ,'20/dec/2012'
        ,'Handler Pro'
        );

最好将列放在insert子句中,以便您可以看到哪些行(即INSERT INTO parts_order (order_id, job_id, vendor_id, ...) VALUES (4, 4, 95115995, ...),以及您(和我们)不必返回表定义,并且如果定义将来发生变化,请避免失败。最好不要依赖隐式日期转换(即使用to_char('05/jan/2013', 'DD/mon/YYYY')

无论如何......它抱怨的约束是VENDOR_ID_FK,我们可以在表定义中看到:

CREATE TABLE parts_order
( order_id NUMBER(11)   
    CONSTRAINT order_id_pk  PRIMARY KEY
  ,job_id NUMBER(11)    
    CONSTRAINT job_id_fk REFERENCES maintenance(job_id)
  ,vendor_id    NUMBER(11)  
    CONSTRAINT vendor_id_fk REFERENCES parts_vendor(part_vendor_id)
  ,parts_status VARCHAR2(20)
  ,date_ordered DATE
  ,date_arrived DATE
  ,date_delivery_due    DATE
  ,part_name VARCHAR2(20) 
    CONSTRAINT part_name_nn NOT NULL);

...反对parts_vendor(part_vendor_id)。错误的含义是您插入的vendor_id 95115995在父parts_vendor表中不存在 - 这是真的,您只插入{{1}的记录值} part_vendor_id123

约束正在按预期工作 - 它阻止你在没有'父'存在的情况下放入'子'记录。您需要为ID 4创建parts_vendor记录,或将您尝试插入95115995的{​​{1}}值更改为已存在的值。