ORA-02291: ошибка ограничения целостности при попытке добавить данные - PullRequest
0 голосов
/ 24 февраля 2020

Я использую 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) нарушено - родительский ключ не найден

Я определенно сделал что-то не так, любая помощь будет оценена. Спасибо

Ответы [ 3 ]

1 голос
/ 25 февраля 2020

проверьте, какие таблицы имеют это ограничение:

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';

Чтобы исправить эту ошибку, вам необходимо сначала вставить значение, которое вы пытались поместить в дочернюю таблицу, в родительскую таблицу. После вставки в качестве родительской строки вы можете go вернуться назад и вставить значение в дочернюю таблицу.

0 голосов
/ 24 февраля 2020

Что вы пытаетесь вставить? Опубликуйте оператор вставки

Либо проверьте, что делает это ограничение. Проверьте 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'
    ;
0 голосов
/ 24 февраля 2020

Я думаю, что вы пытаетесь добавить значение в таблицу (с внешним ключом), которое не имеет соответствующего значения в таблице (с первичным ключом).

Чтобы решить эту проблему: вам нужно добавить значение в таблицу с первичным ключом, а затем вставьте значение во внешнюю таблицу.

...