【问题标题】:How do I make combination of 3 columns in typeorm, postgres unique?如何在 typeorm、postgres 中组合 3 列唯一的?
【发布时间】:2021-07-15 17:35:15
【问题描述】:

如何实现 db 中没有 2 条相同的记录,而这 3 列的值组合起来是相同的?

  @Column()
  sector: string;

  @Column()
  row: string;

  @Column()
  number: string;

【问题讨论】:

    标签: typescript postgresql nestjs typeorm


    【解决方案1】:

    更新答案:

    虽然创建一个独特的 @Index 像 @Johannes 建议的那样适合您,但从语义上讲,更好的解决方案是创建一个 composite unique key

    @Unique(["sector", "row", "number"])
    

    基于https://stackoverflow.com/a/23665806/4343332,Postgres 似乎在内部以相同的方式处理唯一索引和唯一约束。

    因此,选择其中任何一个都不会带来性能优势。

    感谢您的见解@Johannes H. ?

    【讨论】:

    • 大多数 DBMS 也会为唯一约束创建索引结构。不知何故,他们需要确定一个值是否已经存在,而这只有在某种索引存在的情况下才能有效地完成(否则就需要扫描整个表)。对于 PostgreSQL,还请参阅此答案:stackoverflow.com/questions/23542794/….
    • 哇。不知道那件事。谢谢!
    • 当然可以。但是,总的来说,您的答案是绝对正确的。使用索引的 Postgres 是一个实现细节。应该始终使用语义上更合适的方式,在这种情况下,我同意你的看法,这将是一个约束,而不是一个索引。
    【解决方案2】:

    您可以使用@Index 注释实体,如documentation about "Indices with multiple columns" 中所述:

    @Index(["sector", "row", "number"], { unique: true })
    

    【讨论】:

      猜你喜欢
      • 2011-11-17
      • 2023-04-07
      • 1970-01-01
      • 2022-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-25
      • 2013-12-27
      相关资源
      最近更新 更多