mysql - 如何修复 SQL 中的“添加外键失败”
问题描述
我正在 mySQL 中创建一个简单的数据库,对于我的模型的结构,我需要使用 ALTER TABLE 添加外键。
我得到的错误是:
错误代码:1822。添加外键约束失败。引用表 'laboratorio' 中的约束 'esamereale_ibfk_4' 缺少索引
我知道当您尝试指向一个不是唯一或主键的值时,通常会出现此错误,但我认为情况并非如此。
这是我的代码。
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);
解决方案
Ospedale
表中的字段progettoBD.Laboratorio
不是索引的最左侧列,因此出现错误消息。您要么需要Ospedale
单独索引,要么需要更改progettoBD.Laboratorio
表主键中字段的顺序。
推荐阅读
- php - 如何获取具有相同列值的所有行
- python - 新项目如何保存在用户添加的 dat 文件中?
- php - 获取星期一的当前周字符串(CodeIgniter)
- r - R 包 tidymodels 中的 tune_grid 函数出错
- jquery - jQuery 选择器,除了 $ 和 jquery
- swiftui - 用作 SwiftUI 元素的模板
- sql - combining temp tables in stored procedure
- python - Python删除重复项并将它们写入新文件
- javascript - 如何提交表单数据中的多个字段:ReactJS?
- python - 使用其结构对文档进行聚类