Oracle исходный ключ не найден

Обновлено: 06.07.2024

до сих пор все нормально, у меня нет проблем с их созданием, но при вставке значений я сталкиваюсь с некоторыми ошибками, и самая досадная из них-нарушение ограничения целостности-Родительский ключ не найден

вот SQL для вставки значений в таблицы :

я не понимаю, почему у меня есть этот ERRORS, особенно тот из гостевой таблицы, который говорит, что родительский ключ ограничения целостности не найден

2 ответа

Я попытался создать родительскую и дочернюю таблицы следующим образом: CREATE SEQUENCE ProcessLogId; CREATE TABLE ProcessLog ( ProcessLogId NUMBER DEFAULT ProcessLogId.NEXTVAL NOT NULL , ProcessName VARCHAR(20), ProcessStatus VARCHAR(20), StartTime DATE , EndTime DATE, CreatedOn DATE DEFAULT.

Я пытаюсь выполнить вызов хранимой процедуры пакета в Oracle 11g XE, но по какой-то причине получаю ошибку ниже: Отчет об ошибке-ORA-02291: ограничение целостности (ROOT.SYS_C007057) нарушен-Родительский ключ не найден ORA-06512: в строке ROOT.BOOKS_STORE 69 ORA-06512: в строке 2 02291. 00000 -.

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

Но если я сосредоточусь на вашей первой ошибке со следующим утверждением insert :

. похоже, что вы перевернули значения house_id и room_no .

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

. О, и небольшое примечание: не раздражайтесь из-за этих ошибок ограничения целостности. Вместо этого будьте благодарны, что это помешало вам полностью испортить ваши данные.

вы пытаетесь вставить house_id = 'RM301', которого нет в таблицах House .
Поскольку в таблице Geust определены внешние ключи:

вы получаете ошибку ORA-02291.

Похожие вопросы:

Это мой первый раз, когда я использую Oracle. Я вставил что-то в БД вручную: insert into ATTR_TYPE_VALUE (ATTR_TYPE_ID, VALID_VALUE, CREATED_BY) (select ATTR_TYPE_ID, 'Ad', 2 from ATTR_TYPE where.

Я получаю исключение ORA-02291: нарушено ограничение целостности (ADS.ADS_JOB_FAMILIES_F03) - Родительский ключ не найден Я нашел ограничение в таблице, которую вставляю. Как найти Родительский и.

Может кто-то пожалуйста, помогите мне? Я создал все свои таблицы и инструкции insert, и все же я получаю эту ошибку. Это таблица, в которую я пытаюсь вставить данные: CREATE TABLE Avatar ( Avatar_ID.

Я попытался создать родительскую и дочернюю таблицы следующим образом: CREATE SEQUENCE ProcessLogId; CREATE TABLE ProcessLog ( ProcessLogId NUMBER DEFAULT ProcessLogId.NEXTVAL NOT NULL , ProcessName.

Я пытаюсь выполнить вызов хранимой процедуры пакета в Oracle 11g XE, но по какой-то причине получаю ошибку ниже: Отчет об ошибке-ORA-02291: ограничение целостности (ROOT.SYS_C007057).

Итак, первоначальный вопрос, который мне было предложено решить, состоял в следующем: Создайте две таблицы: Сотрудник: empID (PK), empFname, empLname, deptID(FK) и Отдел: deptID (ПК), deptName.

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

поэтому я пишу некоторый код в Oracle и установил следующие таблицы: CREATE TABLE users ( user_id NUMBER NOT NULL, email_address VARCHAR2(50) NOT NULL UNIQUE, first_name VARCHAR2(10) NOT NULL.

create table Researcher (Pid number(7), lname varchar2(12), fname char(10), constraint pkResearcher PRIMARY KEY(Pid)); create table Project (ProjId char(10), MedicName varchar2(10), Purpose.

У меня возникла проблема с вставкой значений в мою таблицу vod_film. Таблицы являются следующие: CREATE TABLE vod_classification ( dbClassId CHAR(3) NOT NULL, dbDescription VARCHAR2(150), CONSTRAINT.

Надеюсь из прошлых, почти полностью теоретических, изложений стало немного яснее, что же все-таки есть реляционные данные и все, что с ними связано. Давайте сейчас попробуем просмотреть все это практически. Наша с вами учебная БД в схеме miller содержит, пять таблиц. Все они в принципе отвечают требованиям 3НФ. Но, когда я их создавал, я не связал столбцы этих таблиц между собой с помощью стандартных средств. А, вот сейчас давайте мы с вами это сделаем. Итак для примера организуем связь, которая чаше всего рекомендована к применению, типа один-ко-многим. Ярким примером для построения такой связи служит две из наших пяти таблиц это CUSTOMERS и SALESREPS. Оператор CREATE TABLE их DDL определений записан следующим образом:

Таблица CUSTOMERS:

Таблица SALESREPS:

При просмотре данных, этих таблиц почти сразу видно, что столбец таблицы SALESREPS - EMPL_NUM есть отношение один-ко-многим столбца CUST_REP для таблицы CUSTOMERS. Для определения связи между таблицами воспользуемся оператором ALTER TABLE и запишем вот такую конструкцию:

Все, связь между столбцами таблиц установлена! Все достаточно просто. Теперь действует ограничение ссылочной целостности и нарушить его нам с вами не позволят! Можно убедиться в этом. Столбец таблицы SALESREPS - EMPL_NUM содержит следующее множество значений 101 .. 110 и отдельно 120. Попробуйте что-нибудь вроде:

После ввода, получаем:

Естественно ошибка ORA-02291! А все потому, что множество 101 .. 110 и отдельно 120 не содержит числа 150! И по этому в данном случае не допустимо! Вот и получилось жесткое отношение один-ко-многим! Так же, можно и удалить связь, между столбцами таблиц применив оператор DROP. Но, нужно узнать имя ссылочной целостности в системе. Сейчас мы его знаем благодаря ошибке. А что если, в процессе работы нужно удалить ссылочную целостность, а потом снова восстановить ее! Для этого обратимся к представлению в вашей схеме USER_CONSTRAINTS. Оно содержит все имена ваших ограничений. Дадим такой запрос:

Там где поле CONSTRAINT_TYPE содержит значение R и есть наше ограничение (по моему от REFERENCES, точно не помню!) Получаем имя ограничения - SYS_C003548 (тоже номер был и в ошибке помните?). Вот теперь давайте от него избавимся:

Вот теперь ограничение снято. Повторим наш предыдущий запрос и посмотрим, что содержит USER_CONSTRAINTS сейчас:

Хорошо видно, что осталось только ограничение первичного ключа таблицы CUSTOMERS имеющее имя SYS_C003506. Кроме того, таблица может содержать ограничение на саму себя например все с той же таблицей SALESREPS можно проделать следующее:

Теперь таблица, как бы это лучше сказать - "самоограничилась", хотя это не всегда оправдано, но вполне применимо и может использоваться! Можете сами с этим всем поработать и определить приоритеты, при проектировании БД, оптимизации и определении ссылочных целостностей таблиц! Но, слишком не увлекайтесь, границы сознания не бесконечны и не стоит выходить за границы понимания, а уж во всяком случае выпускать за них свою БД. :)

Я копирую 30 таблиц с одного сервера на другой с помощью DBLINK:

Но это приводит к:

ORA-02291: integrity constraint (string.string) violated - parent key not found

В конце процедуры остается только одна фиксация.

Четвертая таблица, которую я вставляю, имеет FK для первой и не распознает вставки первой (я пробовал с отложенными ограничениями и той же проблемой: ORA-02291).

вы копируете в правильном порядке? сначала таблицы без внешних ключей, а затем с некоторыми

Да. Это всего лишь часть большого пакета, который работал много раз. Теперь мы увеличиваем размер данных, которые нам нужно скопировать, и обнаруживаем эту ошибку. Порядок правильный.

вы пробовали делать коммит после каждой таблицы?

Я не могу, бизнес-правила . процедура должна копировать все или ничего. (Выполняя фиксацию после каждой таблицы, которую она работает, я пробую ее на другом сервере только для проверки, но процедура не должна этого делать).

Это точно такая же база данных, те же ограничения. Если я сделаю одну и ту же вставку в лист pl sql один за другим, проблем не будет. Ошибки появляются, когда я выполняю процедуру, проблем с данными нет, я проверил все о данных и ограничениях.

Если вы говорите, что проблема в процедуре, и не показываете нам процедуру, как мы можем вам помочь? вы должны предоставить больше информации

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

Вам не нужно делиться своим реальным кодом, просто демонстрация, которая воспроизводит проблему.

Ответы 1

Проблема здесь в том, что вы изменяете данные (DML) через db-link. Это может плохо управляться Oracle и вызывать непредвиденное поведение. Вы должны сделать это наоборот: вместо того, чтобы проталкивать данные, перетащите данные через эту db-ссылку и выполните вставку локально. Конечно, вы, вероятно, не можете технически делать то, что хотите, в целевой базе данных .

Решение, которое у вас есть, - деактивировать FK перед вставками, а затем активировать FK.

Однако я не уверен, что этот DDL возможен напрямую через db-link . Вам может потребоваться создать процедуру для деактивации FK в целевой базе данных и вызвать ее через db-link.

Спасибо за ваш ответ. Это блестящая идея. Я создал две процедуры: одну для отключения ограничений перед вставками, а другую - для включения ограничений. Я выполнил, и это дает мне ту же ошибку. 02298 ключи не найдены . так странно, это сводит меня с ума

Поэтому первоначальный вопрос, который меня попросили решить, состоял в следующем:

Создайте две таблицы: Employee: empID (PK), empFname, empLname, deptID (FK) и отдел: deptID (PK), deptName, chairID. chairID - это empID из таблицы Employee. Вставьте таблицу не менее 3 строк в таблицу Департамента и не менее 6 строк в таблице Employee. Создайте триггер при обновлении стула, который применяет следующие бизнес-правила: один сотрудник может возглавлять не более одного отдела. У каждого отдела есть ровно один стул.

Мое решение проблемы состояло в следующем:

Обе таблицы создают и запускают компиляцию, но при попытке вставить в мои таблицы все мои вставки:

Ошибка SQL: ORA-02291: нарушение целостности (SYSTEM.SYS_C0010675) нарушено - родительский ключ не найден 02291. 00000 - "ограничение целостности (% s.% S) нарушено - родительский ключ не найден" * Причина: значение внешнего ключа не имеет сопоставляя значение первичного ключа. * Действие: удалите внешний ключ или добавьте соответствующий первичный ключ.

Очевидно, что у вас есть логическая проблема (круговые рассуждения): сначала вы не можете создать отдел, если нет сотрудников, потому что ограничение внешнего ключа на CHAIRID не удастся, и вы не можете создавать сотрудников сначала, потому что внешний ключ включен DEPTID не удастся. Тем не менее, ваша модель данных, очевидно, правильная.

Одно из решений - не добавлять внешние ключи прямо в начале. Сделайте все остальное, вставьте данные и только затем измените таблицы, чтобы добавить внешние ключи.

Лучшим решением является добавление FK с самого начала, но сделать их отложенными и первоначально отложенными. Затем вставьте данные, а затем включите ограничения FK. ( На самом деле это хорошая идея, чтобы сделать FK ограничения, откладываемым, потому что вы можете иметь подобные проблемы в будущем, и вы по достоинству оцените гибкость.)

Однако лучшим решением является создание таблиц со всеми ограничениями, как и вы. (Удостоверьтесь, что ограничения FK откладываются). Затем ВСТАВЬТЕ В ДЕПАРТАМЕНТЫ, но со всем CHAIRID оставил NULL . Затем вставьте строки EMPLOYEE, а затем, наконец, ОБНОВЛЯЙТЕ строки DEPARTMENTS, чтобы показать правильный CHAIRID для каждого отдела.

Суть в том, что столбцы FK DO допускают NULL - воспользуются этим, чтобы разорвать порочный круг (круговая логика).

Теперь - ваше требование состоит в том, что каждый отдел должен иметь ровно один стул. вы можете сделать столбец CHAIRID непустым. Это снова будет мешать описанному мной плану. Добавьте это ограничение (и, конечно же, триггер) только после операторов INSERT и UPDATE.

Читайте также: