ORA-02291: ограничение целостности... нарушено — родительский ключ не найден ORA-06512: в «SYS.DBMS_SQL», строка 1721
Я очень новичок в SQL. Это моя первая попытка использования Live SQL. Я продолжаю получать эту ошибку:
ORA-02291: ограничение целостности (SQL_ATLZSRILYVHLJWXPIAPEHJEPK.FK_HOSPITAL_SPECIALTY_ID_PATIENT) нарушено — родительский ключ не найден ORA-06512: в «SYS.DBMS_SQL», строка 1721
Я могу создавать свои таблицы и вставлять информацию в таблицы БОЛЬНИЦА и ПАЦИЕНТ. Однако я не могу вставить данные в таблицы HOSPITAL_SPECIALTY и SPECIALTY. Я возился со всем часами и даже не знаю, что делаю неправильно. Таблицы «БОЛЬНИЦА» и «ПАЦИЕНТ» были такими простыми, и я чувствовал себя так уверенно.
DROP TABLE HOSPITAL;
CREATE TABLE HOSPITAL(
ID INT NOT NULL PRIMARY KEY,
NAME VARCHAR(255) NOT NULL,
ADDRESS VARCHAR(255) NOT NULL,
PHONE INT NOT NULL
);
DROP TABLE PATIENT;
CREATE TABLE PATIENT(
ID INT NOT NULL,
NAME VARCHAR(255) NOT NULL,
ADDRESS VARCHAR(255) NOT NULL,
PHONE INT NOT NULL,
EMERGENCY_CONTACT VARCHAR(255) NOT NULL,
HOSPITAL_ID INT NOT NULL PRIMARY KEY,
CONSTRAINT FK_HOSPITAL_ID_HOSPITAL FOREIGN KEY (HOSPITAL_ID) REFERENCES HOSPITAL(ID)
);
DROP TABLE HOSPITAL_SPECIALTY;
CREATE TABLE HOSPITAL_SPECIALTY(
HOSPITAL_SPECIALTY_ID INT NOT NULL,
HOSPITAL_ID INT NOT NULL,
SPECIALTY_ID INT NOT NULL PRIMARY KEY,
CONSTRAINT FK_HOSPITAL_SPECIALTY_ID_PATIENT FOREIGN KEY (HOSPITAL_SPECIALTY_ID) REFERENCES PATIENT (HOSPITAL_ID)
);
DROP TABLE SPECIALTY;
CREATE TABLE SPECIALTY(
SPECIALTY_ID INT NOT NULL,
SPECIALTY_TYPE INT NOT NULL,
SPECIALTY_TYPE_NAME VARCHAR(255) NOT NULL,
CONSTRAINT FK_SPECIALTY_TYPE_HOSPITAL_SPECIALTY FOREIGN KEY (SPECIALTY_TYPE) REFERENCES HOSPITAL_SPECIALTY (SPECIALTY_ID)
);
INSERT INTO HOSPITAL VALUES (11, 'Super Good Hospital', '999 Speedy Recover, ATL, GA, 99999', '1232223333');
INSERT INTO HOSPITAL VALUES (12, 'Piedmont Hospital', '111 Get Better, ATL, GA, 99990', '1232223334');
INSERT INTO HOSPITAL VALUES (13, 'Northside Hospital', '222 Bum Knee, ATL, GA, 99991', '1232223335');
INSERT INTO HOSPITAL VALUES (14, 'Emory Hospital', '333 Broken Hip, ATL, GA, 99992', '1232223336');
INSERT INTO HOSPITAL VALUES (15, 'Northside Hospital', '111 Bum Knee, ATL, GA, 99991', '1232223334');
SELECT * FROM HOSPITAL
INSERT INTO PATIENT VALUES (37442, 'Billy Jeans', '1111 Somewhere Here, ATL, GA, 11111', '4048888888', 'Jimmy John', '15');
INSERT INTO PATIENT VALUES (37443, 'Allie Grater', '2222 Somewhere There, ATL, GA, 11112', '4048888889', 'Jimmy John', '11');
INSERT INTO PATIENT VALUES (37444, 'Peg Legge', '3333 Somewhere Where, ATL, GA, 11113', '4048888880', 'Jimmy John', '13');
INSERT INTO PATIENT VALUES (37445, 'Olive Yew', '4444 Somewhere Overthere, ATL, GA, 11114', '4048888881', 'Jimmy John', '12');
INSERT INTO PATIENT VALUES (37446, 'Anne T Dote', '5555 Somewhere Overhere, ATL, GA, 11115', '4048888882', 'Jimmy John', '14');
SELECT * FROM PATIENT
INSERT INTO HOSPITAL_SPECIALTY VALUES (111, 11, 1);
INSERT INTO HOSPITAL_SPECIALTY VALUES (112, 11, 1);
INSERT INTO HOSPITAL_SPECIALTY VALUES (113, 11, 1);
INSERT INTO HOSPITAL_SPECIALTY VALUES (114, 11, 1);
INSERT INTO HOSPITAL_SPECIALTY VALUES (115, 11, 1);
SELECT * FROM HOSPITAL_SPECIALTY
INSERT INTO SPECIALTY VALUES (111, 33, 'Brain');
INSERT INTO SPECIALTY VALUES (112, 44, 'General');
INSERT INTO SPECIALTY VALUES (113, 55, 'Surgery');
INSERT INTO SPECIALTY VALUES (114, 66, 'Covid');
INSERT INTO SPECIALTY VALUES (115, 77, 'Bodily Injured');
SELECT * FROM SPECIALTY
2 ответа
Похоже, у вас немного перепутаны зависимости FK. Это похоже на конструкцию «телега впереди лошади»... которая не должна выдавать эту ошибку... если только вы не показываете все данные, которые пытаетесь вставить.
Ваш столHOSPITAL_SPECIALTY
похоже, что это должна быть «таблица пересечений», которая соединяет/ссылаетсяHOSPITAL
сSPECIALTY
. В вашей таблице есть соответствующие столбцыHOSPITAL(HOSPITAL_ID)
иSPECIALTY(SPECIALTY_ID)
но вместо того, чтобы создавать для них FK, вы, похоже, определяете один FK, который обеспечивает ссылку на столбец вPATIENT (HOSPITAL_ID)
.
Опять же, если вы пытаетесь загрузить только данные, показанные выше, я не думаю, что вы получите показанную ошибку, но если вы когда-нибудь попытаетесь загрузить больше данных (или ОБНОВИТЬ, или УДАЛИТЬ), вы столкнетесь с проблемами. .
Я бы порекомендовал дизайн и план загрузки примерно такой:
--It is best to drop all tables before creating.
--You have to drop in reverse-order of your dependencies
DROP TABLE HOSPITAL_SPECIALTY; --depends on patient & hospital
DROP TABLE PATIENT; --depends on hospital
DROP TABLE HOSPITAL;
DROP TABLE SPECIALTY;
--Now create your base tables
CREATE TABLE HOSPITAL(
ID INT NOT NULL PRIMARY KEY,
NAME VARCHAR(255) NOT NULL,
ADDRESS VARCHAR(255) NOT NULL,
PHONE INT NOT NULL
);
CREATE TABLE SPECIALTY(
SPECIALTY_ID INT NOT NULL,
SPECIALTY_TYPE INT NOT NULL,
SPECIALTY_TYPE_NAME VARCHAR(255) NOT NULL
--This looks backwards. I think this constraint would be better on HOSPITAL_SPECIALTY
--, CONSTRAINT FK_SPECIALTY_TYPE_HOSPITAL_SPECIALTY FOREIGN KEY (SPECIALTY_TYPE) REFERENCES HOSPITAL_SPECIALTY (SPECIALTY_ID)
);
--PATIENT references HOSPITAL
CREATE TABLE PATIENT(
ID INT NOT NULL,
NAME VARCHAR(255) NOT NULL,
ADDRESS VARCHAR(255) NOT NULL,
PHONE INT NOT NULL,
EMERGENCY_CONTACT VARCHAR(255) NOT NULL,
HOSPITAL_ID INT NOT NULL PRIMARY KEY,
CONSTRAINT FK_HOSPITAL_ID_HOSPITAL FOREIGN KEY (HOSPITAL_ID) REFERENCES HOSPITAL(ID)
);
-- Since this table seems to depend on two other tables, it is best to add it last
CREATE TABLE HOSPITAL_SPECIALTY(
HOSPITAL_SPECIALTY_ID INT NOT NULL,
HOSPITAL_ID INT NOT NULL,
SPECIALTY_ID INT NOT NULL PRIMARY KEY,
--since HOSPITAL_ID originates in the HOSPITAL table, I would recommend pointing your FK at HOSPITAL instead of PATIENT
--CONSTRAINT FK_HOSPITAL_SPECIALTY_ID_PATIENT FOREIGN KEY (HOSPITAL_SPECIALTY_ID) REFERENCES PATIENT (HOSPITAL_ID)
CONSTRAINT FK_HOSPITAL_SPECIALTY_HOSPITAL_ID FOREIGN KEY (HOSPITAL_ID) REFERENCES HOSPITAL (HOSPITAL_ID),
--Also, instead of the other FK pointing from SPECIALTY to here, it should point the other direction (from here to SPECIALTY)
CONSTRAINT FK_HOSPITAL_SPECIALTY_SPECIALTY_ID FOREIGN KEY (SPECIALTY_ID) REFERENCES SPECIALTY (SPECIALTY_ID)
);
--now load data in the same order: base tables, then dependent
INSERT INTO HOSPITAL VALUES (11, 'Super Good Hospital', '999 Speedy Recover, ATL, GA, 99999', '1232223333');
INSERT INTO HOSPITAL VALUES (12, 'Piedmont Hospital', '111 Get Better, ATL, GA, 99990', '1232223334');
INSERT INTO HOSPITAL VALUES (13, 'Northside Hospital', '222 Bum Knee, ATL, GA, 99991', '1232223335');
INSERT INTO HOSPITAL VALUES (14, 'Emory Hospital', '333 Broken Hip, ATL, GA, 99992', '1232223336');
INSERT INTO HOSPITAL VALUES (15, 'Northside Hospital', '111 Bum Knee, ATL, GA, 99991', '1232223334');
SELECT * FROM HOSPITAL
INSERT INTO SPECIALTY VALUES (111, 33, 'Brain');
INSERT INTO SPECIALTY VALUES (112, 44, 'General');
INSERT INTO SPECIALTY VALUES (113, 55, 'Surgery');
INSERT INTO SPECIALTY VALUES (114, 66, 'Covid');
INSERT INTO SPECIALTY VALUES (115, 77, 'Bodily Injured');
SELECT * FROM SPECIALTY
INSERT INTO PATIENT VALUES (37442, 'Billy Jeans', '1111 Somewhere Here, ATL, GA, 11111', '4048888888', 'Jimmy John', '15');
INSERT INTO PATIENT VALUES (37443, 'Allie Grater', '2222 Somewhere There, ATL, GA, 11112', '4048888889', 'Jimmy John', '11');
INSERT INTO PATIENT VALUES (37444, 'Peg Legge', '3333 Somewhere Where, ATL, GA, 11113', '4048888880', 'Jimmy John', '13');
INSERT INTO PATIENT VALUES (37445, 'Olive Yew', '4444 Somewhere Overthere, ATL, GA, 11114', '4048888881', 'Jimmy John', '12');
INSERT INTO PATIENT VALUES (37446, 'Anne T Dote', '5555 Somewhere Overhere, ATL, GA, 11115', '4048888882', 'Jimmy John', '14');
SELECT * FROM PATIENT
INSERT INTO HOSPITAL_SPECIALTY VALUES (111, 11, 1);
INSERT INTO HOSPITAL_SPECIALTY VALUES (112, 11, 1);
INSERT INTO HOSPITAL_SPECIALTY VALUES (113, 11, 1);
INSERT INTO HOSPITAL_SPECIALTY VALUES (114, 11, 1);
INSERT INTO HOSPITAL_SPECIALTY VALUES (115, 11, 1);
SELECT * FROM HOSPITAL_SPECIALTY
Я вижу ряд проблем с вашим дизайном:
- Таблица PATIENT: PK должен быть идентификатором, а не HOSPITAL_ID.
- Таблицу SPECIALTY следует создать перед таблицей HOSPITAL_SPECIALTY.
- Таблица HOSPITAL_SPECIALTY:
- ПК должен быть HOSPITAL_SPECIALTY_ID.
- HOSPITAL_ID + SPECIALTY_ID должны быть определены как уникальные.
- HOSPITAL_ID должен быть FK для HOSPITAL.ID.
- SPECIALTY_ID должен быть FK для SPECIALTY.ID.
Затем вам нужно вставить данные в порядке
- Больница
- Пациент
- Специальность
- Больница-Специализация