2016-12-10 3 views
0

Когда я вставляю данные в таблицу ASSIGNMENTS, все работает отлично, за исключением значений HARDWARE и SOFTWARE, которые кодируются точно так же, как и другие. Я просто не понимаю.Почему родительский ключ не найден?

Это работает:

INSERT INTO ASSIGNMENTS (ASSIGNMENT_ID, PROJECT_ID, STAFF_ID, JOB_ID) 
VALUES ('A0005','B0002','ST002','J0002'); 

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

INSERT INTO ASSIGNMENTS (ASSIGNMENT_ID, PROJECT_ID, STAFF_ID, JOB_ID, HARDWARE_ID) 
VALUES ('A0005','B0002','ST002','J0002','H0002'); 

Я просто получаю следующее сообщение об ошибке: SQL Error: ORA-02291 : нарушение целостности (JAS1224.SYS_C0028418) нарушено - родительский ключ не найден 02291. 00000 - «ограничение целостности (% s.% s) нарушено - родительский ключ не найден» * Причина: значение внешнего ключа не имеет соответствующего значения первичного ключа , * Действие: удалите внешний ключ или добавьте соответствующий первичный ключ.

Вот весь код, и все таблицы были заселены правильно (таблицы аппаратного и программного обеспечения закодированы в точно таком же формате, что и таблица персонала):

CREATE TABLE PROJECT 
(PROJECT_ID CHAR(5) NOT NULL, 
PROJECT_NAME CHAR(20), 
PROJECT_TYPE CHAR(20), 
START_DATE DATE, 
END_DATE DATE, 
PRIMARY KEY (PROJECT_ID)); 

CREATE TABLE HARDWARE 
(HARDWARE_ID CHAR(5) NOT NULL, 
HARDWARE_NAME CHAR(20), 
PRIMARY KEY (HARDWARE_ID)); 

CREATE TABLE SOFTWARE 
(SOFTWARE_ID CHAR(5) NOT NULL, 
SOFTWARE_NAME CHAR(20), 
PRIMARY KEY (SOFTWARE_ID)); 

CREATE TABLE STAFF 
(STAFF_ID CHAR(5) NOT NULL, 
STAFF_NAME CHAR(20), 
PRIMARY KEY (STAFF_ID)); 

CREATE TABLE JOB 
(JOB_ID CHAR(5) NOT NULL, 
JOB_TYPE CHAR(20), 
JOB_GRADE CHAR(20), 
PRIMARY KEY (JOB_ID)); 

CREATE TABLE ASSIGNMENTS 
(ASSIGNMENT_ID CHAR(5) NOT NULL, 
PROJECT_ID CHAR(5), 
STAFF_ID CHAR(5), 
JOB_ID CHAR(5), 
HARDWARE_ID CHAR(5), 
SOFTWARE_ID CHAR(5), 
PRIMARY KEY (ASSIGNMENT_ID), 
FOREIGN KEY (PROJECT_ID) REFERENCES PROJECT(PROJECT_ID), 
FOREIGN KEY (STAFF_ID) REFERENCES STAFF(STAFF_ID), 
FOREIGN KEY (JOB_ID) REFERENCES JOB(JOB_ID), 
FOREIGN KEY (HARDWARE_ID) REFERENCES HARDWARE(HARDWARE_ID), 
FOREIGN KEY (SOFTWARE_ID) REFERENCES SOFTWARE(SOFTWARE_ID)); 
+0

Действительно ли у вас есть строка в таблице «HARDWARE», где «HARDWARE_ID =« H0002 »? Вы понимаете, как работают первичные ключи и внешние ключи, ссылающиеся на первичные ключи? – mathguy

+0

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

+0

:-) Не беспокойтесь, это случается со всеми. – mathguy

ответ

0

Сообщение об ошибке может быть сначала немного загадочно, но это довольно ясно.

Единственная разница между двумя INSERT s для HARDWARE_ID. Следовательно, 'H0002' недействителен HARDWARE_ID. Это не в таблице HARDWARE.

+1

Спасибо! Это была небольшая ошибка, которую я не понимал, я пытался ее исправить почти на 2 часа. Я видел ваш ответ и думал, что попытаюсь сбросить все таблицы и вставить код обратно, чтобы убедиться, что все есть, и это сработало! Вы были правы, я не должен правильно проверять данные в таблице аппаратных средств. Спасибо за быстрый ответ, это очень помогло мне: D – JadstaSeven

Смежные вопросы