ORA-02291: 当我尝试添加数据时出现完整性约束错误

Posted

技术标签:

【中文标题】ORA-02291: 当我尝试添加数据时出现完整性约束错误【英文标题】:ORA-02291: integrity constraint error when i try add data 【发布时间】:2020-02-24 00:08:16 【问题描述】:

我正在使用 Oracle Apex 创建案例管理系统。在我的案例表中,我想要 3 列来计算一个案例有多少展品、任务和笔记。我尝试在案例表中将展览、任务和注释表作为外键引用,然后在 apex 应用程序构建器中我将使用查询

SELECT COUNT (CASE_ID) FROM Exhibit WHERE CASE_ID = CASE_ID;

这些是我的桌子:

CREATE TABLE Exhibit(
    Exhibit_id int PRIMARY KEY,
    Case_id int,
    Exhibit_Analyst VARCHAR(30),
    Exhibit_Type    VARCHAR(40),
    Exhibit_Priority    VARCHAR(5),
    Exhibit_Description VARCHAR(500),
    Date_Seized DATE,
    Exhibit_Location    VARCHAR(50));

CREATE TABLE Task(
    Task_id int PRIMARY KEY,
    Case_id int,
    Task_Name   VARCHAR(30),
    Task_Description VARCHAR(500),
    Task_Start_Date TIMESTAMP,  
    Task_Deadline TIMESTAMP,
    Task_Status VARCHAR(20));

CREATE TABLE Note(
    Note_id int PRIMARY KEY,
    Case_id int,
    Note_Timestamp  TIMESTAMP,
    Note    VARCHAR(500));

CREATE TABLE Analyst(
    Analyst_id  int PRIMARY KEY,
    Analyst_Name    VARCHAR(30),
    Analyst_dob DATE);

CREATE TABLE Case(
    Case_ID int PRIMARY KEY,
    Case_Name VARCHAR(50),
    Case_Type   VARCHAR(20),
    Analyst_Name VARCHAR(50),
    Case_Started    TIMESTAMP,
    Last_Modified   TIMESTAMP,
    Case_Status VARCHAR(15),
    Exhibit_id int REFERENCES Exhibit(Exhibit_id),
    Task_id int REFERENCES Task(Task_id),
    Note_id int REFERENCES Note(Note_id));

当我尝试在应用程序中插入一行时,它会返回此错误

ORA-02291:违反完整性约束 (TOBY.SYS_C0091649974) - 找不到父键

我肯定做错了什么,任何帮助将不胜感激。谢谢

【问题讨论】:

在哪个表中插入一行? 【参考方案1】:

我认为您正在尝试在表中添加值(使用外键),而表中没有匹配值(使用主键)。

要解决这个问题:您需要将值添加到具有主键的表中,然后将值插入到外部表中。

【讨论】:

【参考方案2】:

您要插入什么?发布您的插入语句

或者,检查该约束的作用。从下面的查询中检查search_condition

    select 
    constraint_name, 
    table_name, 
    case constraint_type 
        when 'C' then 'check constraint on a table'
        when 'P' then 'primary key'
        when 'U' then 'unique key'
        when 'R' then 'referential integrity'
        when 'V' then 'with check option, on a view'
        when 'O' then 'with read only, on a view'
    end constraint_definition,
    search_condition
     from all_constraints
    where owner = 'TOBY'
    and constraint_name = 'SYS_C0091649974'
    ;

【讨论】:

【参考方案3】:

检查哪些表有这个约束:

SELECT C.OWNER, 
       A.TABLE_NAME,
       A.COLUMN_NAME,
       A.CONSTRAINT_NAME,
       -- referenced pk
       C.R_OWNER,
       C_PK.TABLE_NAME R_TABLE_NAME,
       C_PK.CONSTRAINT_NAME R_PK
  FROM ALL_CONS_COLUMNS A
       JOIN ALL_CONSTRAINTS C ON A.OWNER = C.OWNER 
  AND A.CONSTRAINT_NAME = C.CONSTRAINT_NAME
       JOIN ALL_CONSTRAINTS C_PK ON C.R_OWNER = C_PK.OWNER 
  AND C.R_CONSTRAINT_NAME = C_PK.CONSTRAINT_NAME
 WHERE C.CONSTRAINT_TYPE = 'R' AND A.CONSTRAINT_NAME = 'SYS_C0091649974';

为了纠正此错误,您需要先将尝试放入子表中的值插入到父表中。作为父行插入后,您可以返回并将值插入到子表中。

【讨论】:

以上是关于ORA-02291: 当我尝试添加数据时出现完整性约束错误的主要内容,如果未能解决你的问题,请参考以下文章

ORA-02291: 违反完整约束条件 - 未找到父项关键字

ORA-02291: 违反完整性约束 (PRUEBA4.AUTO_MARCA_FK) - 未找到父键

ORA-02291: 违反完整约束条件 (*) - 未找到父项关键字

SQL ORA-02291: 违反完整性约束 - 未找到父键

ORA-02291: 违反完整约束条件 (*) - 未找到父项关键字

ORA-02291: 违反完整性约束 (OPS$P2417335.VOD_FILM_CLASS_FK) - 未找到父密钥