Violated - родительский ключ не найден 02291. 00000 - "ограничение целостности - PullRequest
3 голосов
/ 06 декабря 2010

Привет! Я занимаюсь разработкой базы данных в Oracle SQL dev, которая пытается получить доступ к внешним ключам из другой таблицы.В настоящее время я работаю над таблицей ItemOrdered, которую я создал с помощью следующего оператора CREATE

CREATE TABLE ItemOrdered(OrderID varchar2(9) REFERENCES Ords(OrderID),
BeltID varchar2(9) REFERENCES BeltID(BeltID), 
Quantity varchar(4) NOT NULL,
PRIMARY KEY(OrderID, BeltID))

Как вы можете видеть, у меня есть следующие внешние ключи Ords и BeltID.

Теперь, когда я пытаюсь выполнить следующую инструкцию

INSERT INTO ItemOrdered VALUES(401565981,234489212,'2')

Это дает мне следующую ошибку

нарушено - родительский ключ не найден 02291. 00000 - "нарушение целостности (% s.% s) нарушено - родительский ключ не найден "

Я предоставил свой оператор Ords CREATE, если он необходим

  CREATE TABLE Ords(OrderID varchar2(9) PRIMARY KEY, 
CustomerID varchar(9) REFERENCES Customers(CustomerID), 
    Expected_Delivery_Date date DEFAULT sysdate NOT NULL, 
Actual_Delivery_Date date DEFAULT sysdate NOT NULL, 
    Payment_Due_Date date DEFAULT sysdate NOT NULL, 
Order_Date date DEFAULT sysdate NOT NULL, Price Varchar(10), 
    Order_Placed varchar2(1) CONSTRAINT OrderPlaced 
CHECK(Order_Placed IN('Y','N')) NOT NULL, 
Order_Confirmed varchar2(1)
    CONSTRAINT Order_Confirmed CHECK(Order_Confirmed IN('Y','N')) NOT NULL, 
Order_Completed varchar2(1) CONSTRAINT Order_Completed
    CHECK(Order_Completed IN('Y','N')) NOT NULL)

И я также предоставил свойЗаявление BeltID CREATE

    CREATE TABLE BeltID(BeltID varchar2(9) PRIMARY KEY, 
BeltLengthID varchar2(9) REFERENCES BeltLength(BeltLengthID), 
    ColourID varchar2(9) REFERENCES Colour(ColourID), 
DesignID varchar2(9) REFERENCES Design(DesignID),ComponentID varchar2(9) REFERENCES Component(ComponentID))

Кажется, я не совсем понимаю, почему я получаю эту ошибку.Есть четкое объяснение, почему?

Вот http-ссылка на то, что я пытаюсь сделать. текст ссылки

Ответы [ 2 ]

8 голосов
/ 06 декабря 2010

Из-за ограничений внешнего ключа, указанных вами при создании таблицы ItemOrdered, при выполнении этой вставки:

INSERT INTO ItemOrdered VALUES(401565981,234489212,'2')

... значения 401565981 и 234489212 должны соответствовать значениям ключей в Ords и BelitIdтаблицы соответственно - т.е. эти 2 запроса должны возвращать строки:

select *
from Ords
where OrderId = 401565981;

select *
from BeltId
where BeltId = 234489212;

Сообщение об ошибке указывает на то, что это не так.

1 голос
/ 06 декабря 2010

У меня нет доступной установки Oracle, поэтому я не могу проверить, но имеет ли значение, если вы заключили OrderID и BeltID в одинарные кавычки (что вам следует делать в любом случае, так как столбцы объявлены как varchars)? Я не проверял это, но одной идеей было бы то, что Oracle опровергает тот факт, что вы вставляете числовое значение в столбец varchar.

insert 
  into ItemOrdered VALUES('401565981', '234489212','2')

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

insert 
  into ItemOrdered(OrderID,BeltID,Quantity) values('401565981', '234489212','2')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...