PostgreSQL如何添加外键?创建外键报无唯一约束错误怎么解决
错误原因
- 关系型数据库的外键规则要求:被外键关联的父表字段必须具备唯一性,要么是父表主键,要么被显式设置
UNIQUE唯一约束。 - 你当前
bookstore表的author字段没有唯一约束,允许同一个作者对应多条图书记录,不符合外键关联的前提要求,所以触发42830报错。 - 额外存在设计逻辑问题:你当前的关联方向不符合常规业务逻辑,正常场景下作者是基础主体,一个作者可以对应多本图书,应该是图书表设置外键关联作者表,而非反过来让作者表关联图书表字段。
推荐实现方案(符合常规业务逻辑)
先创建作为父表的作者表,再创建图书表关联作者表主键:
-- 第一步:创建作者表,name作为主键自带唯一约束 create table author ( name varchar primary key, place varchar ); -- 第二步:创建图书表,author_name作为外键关联作者表的name字段 create table bookstore ( book_name varchar primary key, author_name varchar, price decimal, constraint fk_bookstore_author foreign key(author_name) references author(name) );
特殊场景方案(满足你原关联逻辑,不推荐业务使用)
如果你确实需要保留原有的关联逻辑(会限制同一个作者只能在bookstore表中存在一本图书记录),可以先给bookstore的author字段添加唯一约束,再创建author表:
-- 给bookstore表的author字段添加唯一约束,满足外键关联要求 alter table bookstore add constraint uk_bookstore_author unique(author); -- 执行原建表语句即可成功 create table author ( name varchar primary key, place varchar, constraint fk_author_bookstore foreign key(name) references bookstore(author) );
内容的提问来源于stack exchange,提问作者Eric Gideon
相关产品推荐
相关产品推荐

