首页 > 解决方案 > PostGreSQL 向我发送了这条错误消息:“错误:没有唯一约束匹配引用表“corsi”的给定键”。有人能帮我吗?

问题描述

PostGreSQL 向我发送了此错误消息:

“错误:没有唯一约束匹配引用表“corsi”的给定键”

有人能帮我吗?

这些是表格:

CREATE TABLE Genitori (
CF varchar(20) PRIMARY KEY,
Nome varchar(20) NOT NULL,
Cognome varchar(20) NOT NULL
);

CREATE TABLE Medici (
CF varchar(20) PRIMARY KEY,
Nome varchar(20) NOT NULL,
Cognome varchar(20) NOT NULL
);

CREATE TABLE Qualifiche (
NomeQualifica varchar(30) PRIMARY KEY
);

CREATE TABLE Clienti (
NumTessera decimal(5, 0) PRIMARY KEY,
Nome varchar(20) NOT NULL,
Cognome varchar(20) NOT NULL,
DataNascita date NOT NULL,
CFGenitore varchar(20) NOT NULL REFERENCES Genitori (CF) ON UPDATE CASCADE,
NumCertificato decimal(5, 0),
CFMedico varchar(20) NOT NULL REFERENCES Medici (CF) ON UPDATE CASCADE,
DataCertificato date NOT NULL
);

CREATE TABLE Personale (
CF varchar(20) PRIMARY KEY,
Nome varchar(20) NOT NULL,
Cognome varchar(20) NOT NULL,
TipoPersonale varchar(20) NOT NULL,
TipoAssunzione varchar(20),
Ferie varchar(20)
);

CREATE TABLE Telefoni (
Numero decimal(10, 0) PRIMARY KEY,
Tipo varchar(10) NOT NULL,
PersonaProprietaria varchar(20) REFERENCES Personale (CF) ON UPDATE NO ACTION
);

CREATE TABLE Piscine (
CodPiscina varchar(10) PRIMARY KEY,
Nome varchar(20) NOT NULL,
Citta varchar(15) NOT NULL,
Cap decimal(7, 0) NOT NULL,
Via varchar(20) NOT NULL,
PeriodoApertura varchar(20) NOT NULL,
NumTelefono decimal(10, 0) NOT NULL REFERENCES Telefoni (Numero) ON UPDATE CASCADE,
UNIQUE(Nome, Citta, Cap, Via)
);

CREATE TABLE Corsi (
Livello varchar(3),
Tipo varchar(15), 
Piscina varchar(10) REFERENCES Piscine (CodPiscina) ON UPDATE NO ACTION,
PRIMARY KEY (Livello, Tipo, Piscina)
);

CREATE TABLE Attiva (
CodPiscina varchar(10) REFERENCES Piscine (CodPiscina) ON UPDATE CASCADE,
Livello varchar(3) REFERENCES Corsi (Livello),
Tipo varchar(15) REFERENCES Corsi (Tipo),
PRIMARY KEY (CodPiscina, Livello, Tipo)
); 

CREATE TABLE ImpieghiPassati (
CFDipendente varchar(20),
Piscina varchar(10) REFERENCES Piscine (CodPiscina) ON UPDATE NO ACTION,
Fine date NOT NULL,
PRIMARY KEY (CFDipendente, Piscina)
);

CREATE TABLE ImpieghiCorrenti (
CFDipendente varchar(20),
Piscina varchar(10) REFERENCES Piscine (CodPiscina) ON UPDATE NO ACTION,
Inizio date NOT NULL,
PRIMARY KEY (CFDipendente, Piscina)
);

CREATE TABLE Responsabili (
CF varchar (20) REFERENCES Personale (CF),
Nome varchar(20) NOT NULL,
Cognome varchar(20) NOT NULL,
PRIMARY KEY (CF)
);

CREATE TABLE Dirige (
CFResponsabile varchar(20) REFERENCES Responsabili (CF),
Piscina varchar(10) REFERENCES Piscine (CodPiscina) ON UPDATE CASCADE,
Reperibilità varchar(30) NOT NULL,
PRIMARY KEY(CFResponsabile, Piscina)
);

CREATE TABLE Sostituzioni (
Sostituente varchar(20) REFERENCES Personale (CF),
Sostituito varchar(20) REFERENCES Personale (CF),
DataInizio date NOT NULL,
DataFine date NOT NULL,
PRIMARY KEY (Sostituente, Sostituito)
);

CREATE TABLE Vasche (
NumVasca decimal(2, 0) NOT NULL,
Piscina varchar(10) REFERENCES Piscine (CodPiscina),
NumCorsie decimal(2,0) NOT NULL,
Tipologia varchar(15) NOT NULL,
Locazione varchar(10) NOT NULL,
InizioFruizione varchar(20) NOT NULL,
FineFruizione varchar(20) NOT NULL,
PRIMARY KEY (NumVasca, Piscina)
);

CREATE TABLE Qualificati (
CFIstruttore varchar(20) REFERENCES Personale (CF),
NomeQualifica varchar(30) REFERENCES Qualifiche (NomeQualifica),
PRIMARY KEY (CFIstruttore, NomeQualifica)
);

CREATE TABLE Edizioni (
Orario varchar(11),
Giorno varchar(9),
LivelloCorso varchar(3) REFERENCES Corsi (Livello),
TipoCorso varchar(15) REFERENCES Corsi (Tipo),
Piscina varchar(10) REFERENCES Piscine (CodPiscina),
NMax decimal(2, 0) NOT NULL,
NMin decimal(2,0) NOT NULL,
Corsia decimal (2, 0) NOT NULL,
CFIstruttore varchar(20) REFERENCES Personale (CF),
PRIMARY KEY (Orario, Giorno, LivelloCorso, TipoCorso, Piscina)
);

CREATE TABLE Iscritti (
Cliente decimal(5, 0) REFERENCES Clienti(NumTessera),
GiornoEd varchar(9) REFERENCES Edizioni (Giorno),
OrarioEd varchar(11) REFERENCES Edizioni (Orario),
LivelloCorso varchar(3) REFERENCES Corsi (Livello),
TipoCorso varchar(15) REFERENCES Corsi (Tipo),
Piscina varchar(10) REFERENCES Piscine(CodPiscina),
PRIMARY KEY (Cliente, GiornoEd, OrarioEd, LivelloCorso, TipoCorso, Piscina)
);

编辑代码 | | | |

CREATE TABLE Genitori (
CF varchar(20) PRIMARY KEY,
Nome varchar(20) NOT NULL,
Cognome varchar(20) NOT NULL
);

CREATE TABLE Medici (
CF varchar(20) PRIMARY KEY,
Nome varchar(20) NOT NULL,
Cognome varchar(20) NOT NULL
);

CREATE TABLE Qualifiche (
NomeQualifica varchar(30) PRIMARY KEY
);

CREATE TABLE Clienti (
NumTessera decimal(5, 0) PRIMARY KEY,
Nome varchar(20) NOT NULL,
Cognome varchar(20) NOT NULL,
DataNascita date NOT NULL,
CFGenitore varchar(20) NOT NULL REFERENCES Genitori (CF) ON UPDATE CASCADE,
NumCertificato decimal(5, 0),
CFMedico varchar(20) NOT NULL REFERENCES Medici (CF) ON UPDATE CASCADE,
DataCertificato date NOT NULL
);

CREATE TABLE Personale (
CF varchar(20) PRIMARY KEY,
Nome varchar(20) NOT NULL,
Cognome varchar(20) NOT NULL,
TipoPersonale varchar(20) NOT NULL,
TipoAssunzione varchar(20),
Ferie varchar(20)
);

CREATE TABLE Telefoni (
Numero decimal(10, 0) PRIMARY KEY,
Tipo varchar(10) NOT NULL,
PersonaProprietaria varchar(20) REFERENCES Personale (CF) ON UPDATE NO ACTION
);

CREATE TABLE Piscine (
CodPiscina varchar(10) PRIMARY KEY,
Nome varchar(20) NOT NULL,
Citta varchar(15) NOT NULL,
Cap decimal(7, 0) NOT NULL,
Via varchar(20) NOT NULL,
PeriodoApertura varchar(20) NOT NULL,
NumTelefono decimal(10, 0) NOT NULL REFERENCES Telefoni (Numero) ON UPDATE CASCADE,
UNIQUE(Nome, Citta, Cap, Via)
);

CREATE TABLE Corsi (
Livello varchar(3),
Tipo varchar(15), 
Piscina varchar(10) REFERENCES Piscine (CodPiscina) ON UPDATE NO ACTION,
PRIMARY KEY (Livello, Tipo, Piscina)
);

CREATE TABLE Attiva (
CodPiscina varchar(10) REFERENCES Piscine (CodPiscina) ON UPDATE CASCADE,
Livello varchar(3),
Tipo varchar(15),
PRIMARY KEY (CodPiscina, Livello, Tipo),
FOREIGN KEY (Livello, Tipo) REFERENCES Corsi(Livello, Tipo)
); 

CREATE TABLE ImpieghiPassati (
CFDipendente varchar(20),
Piscina varchar(10) REFERENCES Piscine (CodPiscina) ON UPDATE NO ACTION,
Fine date NOT NULL,
PRIMARY KEY (CFDipendente, Piscina)
);

CREATE TABLE ImpieghiCorrenti (
CFDipendente varchar(20),
Piscina varchar(10) REFERENCES Piscine (CodPiscina) ON UPDATE NO ACTION,
Inizio date NOT NULL,
PRIMARY KEY (CFDipendente, Piscina)
);

CREATE TABLE Responsabili (
CF varchar (20) REFERENCES Personale (CF),
Nome varchar(20) NOT NULL,
Cognome varchar(20) NOT NULL,
PRIMARY KEY (CF)
);

CREATE TABLE Dirige (
CFResponsabile varchar(20) REFERENCES Responsabili (CF),
Piscina varchar(10) REFERENCES Piscine (CodPiscina) ON UPDATE CASCADE,
Reperibilità varchar(30) NOT NULL,
PRIMARY KEY(CFResponsabile, Piscina)
);

CREATE TABLE Sostituzioni (
Sostituente varchar(20) REFERENCES Personale (CF),
Sostituito varchar(20) REFERENCES Personale (CF),
DataInizio date NOT NULL,
DataFine date NOT NULL,
PRIMARY KEY (Sostituente, Sostituito)
);

CREATE TABLE Vasche (
NumVasca decimal(2, 0) NOT NULL,
Piscina varchar(10) REFERENCES Piscine (CodPiscina),
NumCorsie decimal(2,0) NOT NULL,
Tipologia varchar(15) NOT NULL,
Locazione varchar(10) NOT NULL,
InizioFruizione varchar(20) NOT NULL,
FineFruizione varchar(20) NOT NULL,
PRIMARY KEY (NumVasca, Piscina)
);

CREATE TABLE Qualificati (
CFIstruttore varchar(20) REFERENCES Personale (CF),
NomeQualifica varchar(30) REFERENCES Qualifiche (NomeQualifica),
PRIMARY KEY (CFIstruttore, NomeQualifica)
);

CREATE TABLE Edizioni (
Orario varchar(11),
Giorno varchar(9),
LivelloCorso varchar(3),
TipoCorso varchar(15),
Piscina varchar(10) REFERENCES Piscine (CodPiscina),
NMax decimal(2, 0) NOT NULL,
NMin decimal(2,0) NOT NULL,
Corsia decimal (2, 0) NOT NULL,
CFIstruttore varchar(20) REFERENCES Personale (CF),
FOREIGN KEY (LivelloCorso, TipoCorso) REFERENCES Corsi (Livello, Tipo),
PRIMARY KEY (Orario, Giorno, LivelloCorso, TipoCorso, Piscina)
);

CREATE TABLE Iscritti (
Cliente decimal(5, 0) REFERENCES Clienti(NumTessera),
GiornoEd varchar(9),
OrarioEd varchar(11),
LivelloCorso varchar(3),
TipoCorso varchar(15),
Piscina varchar(10) REFERENCES Piscine(CodPiscina),
FOREIGN KEY (LivelloCorso, TipoCorso) REFERENCES Corsi(Livello, Tipo),
FOREIGN KEY (GiornoEd, OrarioEd) REFERENCES Edizioni (Giorno, Orario),
PRIMARY KEY (Cliente, GiornoEd, OrarioEd, LivelloCorso, TipoCorso, Piscina)
);

标签: sqldatabasepostgresqlerror-handlingentity-relationship

解决方案


为了能够引用一列,该列应该是候选键(主键或唯一键。在您的结构中,您有一个组合键,因此 fk 也应该是一个组合键:

CREATE TABLE Edizioni (
Orario varchar(11),
Giorno varchar(9),
LivelloCorso varchar(3) ,
TipoCorso varchar(15),
Piscina varchar(10) REFERENCES Piscine (CodPiscina),
NMax decimal(2, 0) NOT NULL,
NMin decimal(2,0) NOT NULL,
Corsia decimal (2, 0) NOT NULL,
CFIstruttore varchar(20) REFERENCES Personale (CF),
PRIMARY KEY (Orario, Giorno, LivelloCorso, TipoCorso, Piscina),
Foreign Key (LivelloCorso,TipoCorso) REFERENCES Corsi (Livello,Tipo)
);

Iscritti 表也是如此


推荐阅读