TypeORM一对一关联如何将外键设为表主键并添加唯一约束
TypeORM外键同时作为实体主键、唯一键实现方案
场景说明
所有唯一实体数据都是表的候选键,被unique约束限制的数据列都属于候选键。需求为将实体中的一对一关联外键设置为唯一键,同时作为该实体的主键,示例实体初始定义如下:
@Entity() export class A extends BaseEntity { @PrimaryColumn() id: number; } @Entity() export class B extends BaseEntity { @OneToOne(() => A) // 需要将该关联对应的外键设置为唯一键,同时作为B的主键 @JoinColumn() a: A; }
已失效的旧版本写法
早期TypeORM版本支持在@OneToOne装饰器的配置项中传入primary: true实现该需求,但新版本的RelationOptions类型已移除primary属性,该写法不再可用:
@OneToOne( type => A, {primary: true}) @JoinColumn() a: A
虽然可以通过@Unique装饰器手动标记关联列唯一,但这不是适配该场景的最优方案。
新版本标准实现
直接在关联属性上叠加@PrimaryColumn装饰器即可,@JoinColumn自动生成的外键列会被识别为当前实体的主键:
@Entity() export class B extends BaseEntity { @OneToOne(() => A) @JoinColumn() @PrimaryColumn() a: A; }
方案特性
- 数据库主键本身自带非空、唯一约束,不需要额外添加
@Unique装饰器即可满足唯一性要求 - 该写法是官方移除
RelationOptions.primary配置后推荐的共享主键一对一关系实现方式,兼容当前正式版本 - 最终生成的B表不会额外创建独立主键字段,直接以关联A表的外键作为主键,完全匹配需求
内容的提问来源于stack exchange,提问作者juztcode
相关产品推荐
相关产品推荐

