如何在 typeorm、postgres 中组合 3 列唯一的?

Posted

技术标签:

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

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

  @Column()
  sector: string;

  @Column()
  row: string;

  @Column()
  number: string;

【问题讨论】:

【参考方案1】:

更新答案:

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

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

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

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

感谢您的见解@Johannes H. ?

【讨论】:

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

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

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

【讨论】:

以上是关于如何在 typeorm、postgres 中组合 3 列唯一的?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Typeorm 创建与 Postgres 的连接

我如何将 Postgres DateRange 类型与 TypeOrm 一起使用

如何使用 TypeORM 为 postgres 数据库和 nodejs 使用参数化查询作为应用程序的后端服务器

使用 typeorm 在 postgres 中搜索数组中的项目

如何以正确的方式将@admin-bro/nestjs 与@admin-bro/typeorm 和postgres 一起使用?

节点服务器无法通过 Docker 连接到 Postgres,使用 TypeORM