【问题标题】:SQL Error: ORA-02291: integrity constraintSQL 错误:ORA-02291:完整性约束
【发布时间】:2010-12-03 21:04:28
【问题描述】:

我正在创建一个试图从外键访问值的数据库。我创建了以下两个表格

CREATE TABLE Component(
    ComponentID varchar2(9) PRIMARY KEY
    , TypeID varchar2(9) REFERENCES TypeComponent(TypeComponentID)
)

INSERT INTO Component VALUES(192359823,785404309)
INSERT INTO Component VALUES(192359347,785404574)
INSERT INTO Component VALUES(192359467,785404769)
INSERT INTO Component VALUES(192359845,785404867)
INSERT INTO Component VALUES(192359303,785404201)
INSERT INTO Component VALUES(192359942,785404675)


CREATE TABLE TypeComponent (
    TypeComponentID varchar2(9) PRIMARY KEY
    , Type_Description varchar2(30) CONSTRAINT Type_Description 
        CHECK(Type_Description IN('Strap', 'Buckle', 'Stud')) NOT NULL
)

INSERT INTO TypeComponent VALUES(785404309, 'Strap')
INSERT INTO TypeComponent VALUES(785404574, 'Stud')
INSERT INTO TypeComponent VALUES(785404769, 'Buckle')
INSERT INTO TypeComponent VALUES(785404867, 'Strap')
INSERT INTO TypeComponent VALUES(785404201, 'Buckle')
INSERT INTO TypeComponent VALUES(785404675, 'Stud')

这是两张表。 ComponentTypeComponentComponentTypeComponent 的父实体,我正在尝试运行以下 INSERT 语句:

INSERT INTO Component VALUES(192359823,785404309)

但它给了我错误

这是我目前在 Oracle SQL 开发中的会话

【问题讨论】:

  • 能否请您发布您的整个会话并重新格式化您的帖子?
  • 每当您输入 SQL 语句和错误日志时,请选择语句并单击代码(即带有1010 的图标,以便其清晰易读。谢谢。

标签: sql oracle ora-02291


【解决方案1】:

尝试先插入您的TypeComponent 表,然后再插入您的Component 表。

根据错误:

ORA-02291:    违反完整性约束 (string.string) - 未找到父键
原因:           外键值没有匹配的主键值。
操作:            删除外键或添加匹配的主键。

这意味着您引用的表中没有匹配的键。

编辑#1

为了您的善意信息,这里是一个站点,您可以在其中获得有关所有 Oracle 错误代码的帮助。

http://[ora-02291].ora-code.com/

这是该网站的主页:http://www.ora-code.com/

您可以在哪里替换 URL 中的错误代码以适合您获得的错误代码,并且您将访问该错误的页面。

【讨论】:

  • 那么你是说我应该先删除这两个表,然后先创建 TypeComponent 表,然后再将语句插入到 Component 表中?
  • 理想情况下,知道什么是依赖的,什么不是。在您的方案中,Component 取决于 TypeComponent。我喜欢把它想象成一个原子对象。它可以单独存在。另一方面,没有TypeComponentComponent 就不能存在,因为它的TypeID 字段引用了TypeComponent 表的主键。因此,当插入Component 时,数据库引擎会检查您给它的引用,TypeComponent.TypeComponentID 的值,并且由于找不到它,它会拒绝插入,否则您会担心数据完整性.
  • 我认为表创建顺序在这里不是问题,因为您说它们都存在于您的数据库中。另外,如果您在Component 之前创建TypeComponent 表,可能会很明显,TypeComponent 中需要存在一行才能插入Component
【解决方案2】:

请发布您的整个 SQLPLUS 会话,以便可以轻松重现错误。

看起来在插入到导致此错误的父表之前完成了对子表的插入。

更改插入顺序并重新运行代码。

SQL> CREATE TABLE TypeComponent(
  2    TypeComponentID varchar2(9) PRIMARY KEY, 
  3    Type_Description     varchar2(30) 
  4    CONSTRAINT Type_Description CHECK(Type_Description IN('Strap', 'Buckle', 'Stud')) NOT NULL
  5  )
  6  ;

Table created.

SQL> CREATE TABLE Component(
  2    ComponentID varchar2(9) PRIMARY KEY, 
  3    TypeID varchar2(9) REFERENCES TypeComponent(TypeComponentID)
  4  )
  5  ;

Table created.

SQL> INSERT INTO Component VALUES(192359823,785404309);
INSERT INTO Component VALUES(192359823,785404309)
*
ERROR at line 1:
ORA-02291: integrity constraint (COAMGR.SYS_C002513823) violated - parent key
not found

SQL> INSERT INTO TypeComponent VALUES(785404309, 'Strap');

1 row created.

SQL> INSERT INTO Component VALUES(192359823,785404309);

1 row created.

SQL> commit;

Commit complete.

【讨论】:

    【解决方案3】:

    component 表中你有

     TypeID REFERENCES TypeComponent(TypeComponentID)
    

    然后你继续

    INSERT INTO Component VALUES(192359823,785404309)
    

    如果您先执行此操作,则 Oracle 将抛出 Integrity constraint 错误,因为您试图将 TypeComponent 表中不存在的值插入到 component 表中。

    这是一个问题,因为您提到TypeID 是外键,即TypeID 的值在插入Component 之前需要存在于TypeComponent

    【讨论】:

    • 这里值得指出一个通用规则:填充数据时,先填充reference数据(所以组件type是引用数据),然后是main数据。
    【解决方案4】:

    引用的键(在我的情况下为外键)有时会出现此错误,这有错误。请在表中重新创建引用的键。

    【讨论】:

      猜你喜欢
      • 2015-04-11
      • 1970-01-01
      • 2021-02-17
      • 2020-07-19
      • 2018-09-09
      • 2021-08-12
      • 1970-01-01
      • 2016-03-12
      • 1970-01-01
      相关资源
      最近更新 更多