Как исправить «Не удалось добавить внешний ключ» в SQL - PullRequest
0 голосов
/ 13 января 2019

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

Ошибка, которую я получаю:

Код ошибки: 1822. Не удалось добавить ограничение внешнего ключа. Отсутствует индекс для ограничения 'esamereale_ibfk_4' в ссылочной таблице 'Laboratorio'

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

Это мой код.

CREATE SCHEMA ProgettoBD;

CREATE TABLE progettoBD.Paziente(
    CF_Paziente CHAR(16) PRIMARY KEY,
    Nome_Paziente VARCHAR (10) NOT NULL,
    Cognome_Paziente VARCHAR (15) NOT NULL,
    Indirizzo VARCHAR (30),
    Luogo VARCHAR (10),
    Data VARCHAR(10),
    Telefono VARCHAR(10),
    Mail VARCHAR(30),
    Cellulare VARCHAR(10)
    );

CREATE TABLE progettoBD.Esame(
    Codice_Esame CHAR(5) PRIMARY KEY,
    Nome_Esame VARCHAR (20) NOT NULL,
    Costo INT NOT NULL
    );

CREATE TABLE progettoBD.Prenotazione(
    Codice_Prenotazione CHAR(8) PRIMARY KEY,
    Paziente CHAR(16)
    );

CREATE TABLE progettoBD.EsameReale(
    Cod_Prenotazione CHAR (8),
    Tipo_Esame CHAR(5),
    Data VARCHAR(10),
    Ora VARCHAR(5),
    Urgenza VARCHAR(15),
    Parametri VARCHAR (30),
    Laboratorio CHAR (5),
    Ospedale CHAR(4),
    Medico CHAR (16),
    Diagnosi VARCHAR (50),
    PRIMARY KEY (Cod_Prenotazione, Tipo_Esame, Data, Ora)
    );

CREATE TABLE progettoBD.Laboratorio(
    Codice_Laboratorio CHAR(5),
    Ospedale CHAR(4),
    Nome_Laboratorio VARCHAR(15) NOT NULL,
    Piano INT,
    Stanza INT,
    Responsabile_laboratorio CHAR(16),
    PRIMARY KEY (Codice_Laboratorio, Ospedale)

    );

CREATE TABLE progettoBD.Ospedale(
    Codice_Ospedale CHAR(4) PRIMARY KEY,
    Nome_Ospedale VARCHAR(15) NOT NULL,
    Indirizzo VARCHAR(30),
    Responsabile_Ospedale CHAR(16)
    );

CREATE TABLE progettoBD.Reparto(
    Codice_Reparto CHAR(5),
    Ospedale CHAR(4),
    Nome_Reparto VARCHAR(10) NOT NULL,
    Num_Telefono CHAR(10),
    PRIMARY KEY (Codice_Reparto, Ospedale)
    );

CREATE TABLE progettoBD.Medico(
    CF_Medico CHAR(16) PRIMARY KEY,
    Nome_Medico VARCHAR(10) NOT NULL,
    Cognome VARCHAR(15) NOT NULL,
    Indirizzo VARCHAR(30),
    Reparto CHAR(5),
    Ospedale CHAR(4)
    );

CREATE TABLE progettoBD.Primario(
    CF_Primario CHAR(16) PRIMARY KEY,
    Reparto_Primario CHAR(5),
    Ospedale CHAR(4)
    );

CREATE TABLE progettoBD.Volontario(
    CF_Volontario CHAR(16) PRIMARY KEY,
    Associazione VARCHAR(20)
    );

CREATE TABLE progettoBD.Specializzazione(
    Nome_Specializzazione VARCHAR(15) PRIMARY KEY
    );

CREATE TABLE progettoBD.Possiede(
    Primario VARCHAR(16),
    Specializzazione VARCHAR(15),
    PRIMARY KEY (Primario, Specializzazione)
    );

ALTER TABLE progettoBD.Prenotazione
    ADD FOREIGN KEY (Paziente) REFERENCES progettoBD.Paziente(CF_Paziente);

ALTER TABLE progettoBD.EsameReale
    ADD FOREIGN KEY (Cod_Prenotazione) REFERENCES progettoBD.Prenotazione(Codice_Prenotazione),
    ADD FOREIGN KEY (Tipo_Esame) REFERENCES progettoBD.Esame(Codice_Esame),
    ADD FOREIGN KEY (Laboratorio) REFERENCES progettoBD.Laboratorio(Codice_Laboratorio),
    ADD FOREIGN KEY (Ospedale) REFERENCES progettoBD.Laboratorio(Ospedale);

ALTER TABLE progettoBD.Laboratorio
    ADD FOREIGN KEY (Ospedale) REFERENCES progettoBD.Ospedale(Codice_Ospedale),
    ADD FOREIGN KEY (Responsabile_Laboratorio) REFERENCES progettoBD.Medico(CF_Medico);

ALTER TABLE progettoBD.Ospedale
    ADD FOREIGN KEY (Responsabile_Ospedale) REFERENCES progettoBD.Medico(CF_Medico);

ALTER TABLE progettoBD.Reparto
    ADD FOREIGN KEY (Ospedale) REFERENCES progettoBD.Ospedale(Codice_Ospedale);

ALTER TABLE progettoBD.Medico
    ADD FOREIGN KEY (Reparto) REFERENCES progettoBD.Reparto(Codice_Reparto),
    ADD FOREIGN KEY (Ospedale) REFERENCES progettoBD.Reparto(Ospedale);

ALTER TABLE progettoBD.Primario
    ADD FOREIGN KEY (CF_Primario) REFERENCES progettoBD.Medico(CF_Medico),
    ADD FOREIGN KEY (Reparto_Primario) REFERENCES progettoBD.Reparto(Codice_Reparto),
    ADD FOREIGN KEY (Ospedale) REFERENCES progettoBD.Reparto(Ospedale);

ALTER TABLE progettoBD.Volontario
    ADD FOREIGN KEY (CF_Volontario) REFERENCES progettoBD.Medico(CF_Medico);

ALTER TABLE progettoBD.Possiede
    ADD FOREIGN KEY (Primario) REFERENCES progettoBD.Primario(CF_Primario),
    ADD FOREIGN KEY (Specializzazione) REFERENCES progettoBD.Specializzazione(Nome_Specializzazione);

Я уже пробовал свой код, удаляя эту строку, и он отлично работает.

ADD FOREIGN KEY (Ospedale) REFERENCES progettoBD.Laboratorio(Ospedale);

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Столбец Ospedale в таблице progettoBD.Laboratorio не индексируется. Кроме того, progettoBD.Laboratorio.Ospedale относится к progettoBD.Ospedale.Codice_Ospedale. Это очень странно, что вы пытаетесь сослаться на поле второй таблицы, которая имеет ссылку на третью таблицу.

0 голосов
/ 13 января 2019
Поле

Ospedale в таблице progettoBD.Laboratorio не является крайним левым столбцом индекса, поэтому появляется сообщение об ошибке. Вам нужно либо индексировать Ospedale отдельно, либо изменить порядок полей в progettoBD.Laboratorio первичном ключе таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...