PostgreSQL建表报corsi表无匹配唯一键的外键引用错误求助
PostgreSQL建表报错排查结果
报错原因
你收到的报错核心是PostgreSQL外键约束规则限制:外键指向的字段组合,必须在被引用表中存在对应的唯一约束(主键约束本身就是特殊的唯一约束)。
你的Corsi表使用三字段联合主键:(Livello, Tipo, Piscina),但修改后的代码中,Attiva、Edizioni、Iscritti三个表关联Corsi的外键仅关联了(Livello, Tipo)两个字段,该组合在Corsi表无唯一约束,因此触发报错。
修复方案
将所有引用Corsi的外键补全第三个关联字段,和Corsi的主键字段数量、顺序完全匹配即可:
- 修改
Attiva表外键定义
CREATE TABLE Attiva ( CodPiscina varchar(10) REFERENCES Piscine (CodPiscina) ON UPDATE CASCADE, Livello varchar(3), Tipo varchar(15), PRIMARY KEY (CodPiscina, Livello, Tipo), -- 补全Piscina字段关联,Attiva的CodPiscina对应Corsi的Piscina字段 FOREIGN KEY (Livello, Tipo, CodPiscina) REFERENCES Corsi(Livello, Tipo, Piscina) );
- 修改
Edizioni表外键定义
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), -- 补全Piscina字段关联 FOREIGN KEY (LivelloCorso, TipoCorso, Piscina) REFERENCES Corsi (Livello, Tipo, Piscina), PRIMARY KEY (Orario, Giorno, LivelloCorso, TipoCorso, Piscina) );
- 修改
Iscritti表外键定义
同时注意Iscritti表关联Edizioni的外键也不符合规则:Edizioni主键为5字段联合主键,外键也需要补全所有对应字段,否则后续会触发相同类型报错:
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), -- 补全Corsi关联的Piscina字段 FOREIGN KEY (LivelloCorso, TipoCorso, Piscina) REFERENCES Corsi(Livello, Tipo, Piscina), -- 补全Edizioni关联的所有主键字段 FOREIGN KEY (GiornoEd, OrarioEd, LivelloCorso, TipoCorso, Piscina) REFERENCES Edizioni (Giorno, Orario, LivelloCorso, TipoCorso, Piscina), PRIMARY KEY (Cliente, GiornoEd, OrarioEd, LivelloCorso, TipoCorso, Piscina) );
内容的提问来源于stack exchange,提问作者Andrea
相关产品推荐
相关产品推荐

