【问题标题】:How do I make sure that all rows with the same foreign key have unique names in my PostgreSQL database?如何确保具有相同外键的所有行在我的 PostgreSQL 数据库中具有唯一名称?
【发布时间】:2021-03-16 20:56:09
【问题描述】:
我有一个 PostgreSQL 数据库,其中包含两个表:Team 和 Project,是一对多的关系。
团队有这些列:
项目有这些:
我想确保团队中的项目必须具有唯一的名称。
属于不同团队的项目应该能够毫无问题地共享名称,所以UNIQUE 并没有真正的帮助。
似乎我可以使用自定义 CHECK 约束来执行此操作,但如果做不到这一点,那么在 javascript 中实现它的明智、声明性方式是什么?
我使用Prisma 与我的数据库交互,在我的应用程序的其他地方我使用Yup 来验证对象的模式。也许我可以以某种方式将它们结合起来?
【问题讨论】:
标签:
sql
postgresql
create-table
unique-constraint
alter-table
【解决方案1】:
你可以创建一个唯一的约束:
alter table project add constraint unq_project_teamid_name
unique (team_id, name);
您也可以使用唯一索引来做到这一点:
create unique index unq_project_teamid_name on project(team_id, name);
【解决方案2】:
您可以使用复合唯一键:
create table project (
id serial primary key,
name text,
team_id int references team(id),
unique (team_id, name)
);
或者,如果您想将其添加到现有表中:
alter table project
add constraint cs_project_uniq_name_team
unique(team_id, name)
;