找不到父键,但存在oracle DB

时间:2018-08-05 22:29:45

标签: oracle-sqldeveloper

在开始显示错误消息之前,我想对供应商和产品表显示一个简单的左联接查询:

select p.id as ProductId, p.vendorid as VendorFk, v.id as VendorPk
    from Vendors v
        left join products p
        on v.id = p.vendorid;

enter image description here

如上图所示,我运行了与下图类似的插入操作,成功进行了五次。在尝试6号时,它似乎失败了。我不太确定为什么。我是Oracle的新手,以前从未遇到过MS SQL Server这样的问题。任何帮助将不胜感激。另外,我正在使用Oracle SQL Developer。

-“错误报告- ORA-02291:违反完整性约束(SYSTEM.FK_VENDORS_ID)-找不到父密钥”

insert into products(cost , id , name , partnumber , VendorId)
values(99.99, 6, 'xbox', 'xbox1', 2);

1 个答案:

答案 0 :(得分:0)

  • 您有两个表:PRODUCTS和VENDORS
  • PRODUCTS的名为VENDORID的列是指向VENDORS.ID的外键。
  • 参照完整性意味着供应商必须包含您要插入到PRODUCTS表中的ID。如果不这样做,则将破坏完整性,并且Oracle会引发错误
  • 在您的示例中,VENDORS表中似乎没有ID = 2,尽管图像(第5行)表明有所不同

一个简短的例子:

SQL> create table vendors (id number primary key);

Table created.

SQL> create table products (id number primary key,
  2                         vendorid number constraint fk_pv references vendors);

Table created.

SQL> insert into vendors values (1);

1 row created.

SQL> -- this will be OK as vendors.id = 1 exists
SQL> insert into products values (100, 1);

1 row created.

SQL> -- this will fail as vendors.id = 2 doesn't exist
SQL> insert into products values (200, 2);
insert into products values (200, 2)
*
ERROR at line 1:
ORA-02291: integrity constraint (SCOTT.FK_PV) violated - parent key not found


SQL>

那么,怎么可能出问题了?如果其他人使用该架构,则他们可能已从VENDORS表中删除ID = 2。这样做没有问题,只要您不向已完成的产品中提交插入(应该已经向VENDORS中插入插入,否则其他用户将不得不等到锁定之后已发布)。

P.S。哦,是的-还有一件事:错误消息表明您正在使用SYSTEM模式。不要这样做-SYS和SYSTEM是 special ,它们拥有数据库。如果您(无意地)执行了错误和意外的操作,则可能会破坏数据库。创建另一个用户(或者如果您已经在数据库版本中预先安装了它们,则使用一个现有的用户,例如HR或SCOTT)并在那里测试您的技能。