You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在NestJS+TypeORM中无法实现一对多关联的外键约束

问题排查与修复方案

你的错误源于一对多关联关系的注解使用错误,具体问题和修复步骤如下:

核心问题

@JoinColumn 装饰器只能用在关系的拥有方(即 ManyToOne 所在的实体,也就是 Token),而你在 User 实体的 @OneToMany 上错误添加了这个注解,导致 TypeORM 尝试在 users 表中创建一个不存在的外键列 tokens,进而触发外键约束创建失败。

修复步骤

1. 修正 User 实体

移除 @OneToMany 上方的 @JoinColumn 装饰器,OneToMany 作为关系的反向侧,不需要指定外键列:

@Entity('users')
export default class User {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column({ unique: true, nullable: false })
  mobileNumber: string;

  @Column({ length: 25, nullable: true })
  firstName: string;

  @Column({ length: 25, nullable: true })
  lastName: string;

  @Column('json', { nullable: false })
  secret: any;

  // 移除多余的 @JoinColumn
  @OneToMany(() => Token, (token) => token.user)
  tokens: Token[];

  @CreateDateColumn()
  createdAt: Date;

  @UpdateDateColumn()
  updatedAt: Date;
}

2. 优化 Token 实体(可选但推荐)

保持 @ManyToOne 上的 @JoinColumn,建议将外键列名改为更规范的 userId(需确保数据库中 tokens 表的对应列类型为 uuid,与 users.id 一致):

@Entity('tokens')
export default class Token {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column({ unique: true, nullable: false })
  token: string;

  @ManyToOne(() => User, (user) => user.tokens)
  // 列名改为 userId,更符合数据库命名规范
  @JoinColumn({ name: 'userId' })
  user: User;

  @Column({ unique: true, nullable: false })
  @Generated('uuid')
  refreshToken: string;

  @CreateDateColumn()
  createdAt: Date;

  @UpdateDateColumn()
  updatedAt: Date;
}

额外注意事项

  • 如果数据库中已经存在旧的表结构,建议删除旧表后重启应用,或者通过 TypeORM 迁移工具更新表结构,避免残留的错误字段影响关联关系。
  • 确保 tokens 表中的外键列(user 或 userId)与 users 表的 id 列类型完全一致(均为 uuid)。

内容的提问来源于stack exchange,提问作者Ali Reza Riahi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 02:55:13