在开始显示错误消息之前,我想对供应商和产品表显示一个简单的左联接查询:
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;
如上图所示,我运行了与下图类似的插入操作,成功进行了五次。在尝试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);
答案 0 :(得分:0)
一个简短的例子:
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)并在那里测试您的技能。