【问题标题】: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 数据库,其中包含两个表:TeamProject,是一对多的关系。

团队有这些列:

  • 身份证
  • 姓名

项目有这些:

  • 身份证
  • 姓名
  • team_id

我想确保团队中的项目必须具有唯一的名称。

属于不同团队的项目应该能够毫无问题地共享名称,所以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)
    ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 2021-11-24
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 2020-06-22
      相关资源
      最近更新 更多