如何在 TypeORM、PostgreSQL 中使三列的组合唯一?

13

如何实现数据库中的三列值合并相同时不重复记录?

  @Column()
  sector: string;

  @Column()
  row: string;

  @Column()
  number: string;
2个回答

13

更新后的答案:

虽然像@ Johannes建议的创建唯一的@Index对您有用,但从语义上讲,更好的解决方案是创建一个组合唯一键

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

根据https://dev59.com/QmAg5IYBdhLWcg3wfa96#23665806,Postgres似乎在内部以相同方式处理唯一索引和唯一约束。

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

感谢@Johannes H.的见解。


1
大多数DBMS也会为唯一约束创建索引结构。不知何故,它们需要确定值是否已经存在,如果没有某种类型的索引,这只能高效地完成(否则将需要扫描整个表)。对于PostgreSQL,还可以参考此答案:https://dev59.com/QmAg5IYBdhLWcg3wfa96:~:text=Uniqueness%20is%20a%20constraint.,be%20associated%20only%20with%20constraints. - Johannes H.
哇,我不知道那个。谢谢! - Eranga Heshan
1
当然没问题。总的来说,你的答案绝对正确。Postgres无论如何使用索引都是一种实现细节。一个人应该始终使用语义上更合适的方式,在这种情况下我同意你的看法,这应该是一个约束而不是一个索引。 - Johannes H.
是否与PRIMARY KEY('sector','row','number')相同? - Aeternus

3
你可以像“使用多列索引”文档中描述的那样,使用@Index注释实体:
@Index(["sector", "row", "number"], { unique: true })

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接