FastAPI连接PostgreSQL报错:外键关联无唯一约束问题求助
问题分析与解决
错误原因
你遇到的InvalidForeignKeyError是因为PostgreSQL要求外键引用的字段必须具备唯一约束(UNIQUE)或主键(PRIMARY KEY)。从报错的SQL语句能看到:
bolum表的外键fakulte_id引用了fakulte表的id字段- 但
fakulte表的id字段并不是单独的主键或唯一约束字段(大概率fakulte表也用了类似bolum的复合主键:id + olusturma_zamani + guncelleme_zamani)
解决方法
方案1:调整外键引用(适配复合主键)
如果fakulte表确实需要复合主键,那bolum表必须补充对应的关联字段,并修改外键引用整个复合主键:
- 在
bolum表中添加fakulte_olusturma_zamani和fakulte_guncelleme_zamani两个字段 - 修改外键定义为:
FOREIGN KEY(fakulte_id, fakulte_olusturma_zamani, fakulte_guncelleme_zamani) REFERENCES fakulte (id, olusturma_zamani, guncelleme_zamani)
方案2:修改fakulte表的主键设计(更推荐)
通常UUID类型的id本身具备唯一性,不需要和时间字段组合成复合主键。修改fakulte表的主键为单独的id:
-- 重新定义fakulte表的主键 ALTER TABLE fakulte DROP CONSTRAINT fakulte_pkey; ALTER TABLE fakulte ADD PRIMARY KEY (id);
之后再重新创建bolum表,原有的外键引用就会生效。
错误原文
sqlalchemy.exc.ProgrammingError: (sqlalchemy.dialects.postgresql.asyncpg.ProgrammingError) <class 'asyncpg.exceptions.InvalidForeignKeyError'>: there is no unique constraint matching given keys for referenced table "fakulte" [SQL: CREATE TABLE bolum ( adi VARCHAR(255) NOT NULL, adres VARCHAR(255) NOT NULL, telefon VARCHAR(255) NOT NULL, fakulte_id UUID NOT NULL, id UUID NOT NULL, olusturma_zamani TIMESTAMP WITHOUT TIME ZONE NOT NULL, guncelleme_zamani TIMESTAMP WITHOUT TIME ZONE NOT NULL, PRIMARY KEY (id, olusturma_zamani, guncelleme_zamani), FOREIGN KEY(fakulte_id) REFERENCES fakulte (id) ) ] (Background on this error at: https://sqlalche.me/e/20/f405)
内容的提问来源于stack exchange,提问作者yunus tapan
相关产品推荐
相关产品推荐

