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

如何使用sequelize-typescript通过非主键字段建立一对多关联

解决Sequelize-Typescript非主键字段一对多关联问题

错误信息翻译:
sqlMessage: "外键约束'users_ibfk_1'中的引用列'account_number'与被引用列'id'不兼容。"

问题出在Customer模型的@HasMany关联配置上——默认情况下Sequelize会自动使用模型主键id作为关联的目标字段,但你实际想基于非主键account_number建立关联,导致字段类型(string vs number)不匹配,触发外键约束错误。

修正方案

在Customer的@HasMany装饰器中,明确指定关联的外键字段(User表中的account_number)和被引用的源字段(Customer表中的account_number),同时确保两个表的account_number字段类型完全一致。

修正后的代码

User模型(保持原有配置即可)

// User模型代码
import {
  Table,
  Column,
  Model,
  ForeignKey,
  PrimaryKey,
  AutoIncrement,
  Unique,
  CreatedAt,
  UpdatedAt,
  BelongsTo,
} from "sequelize-typescript";
import sequelize from "../../db_config";
import Customer from "../customer/customer.model";
import UserDTO from "./dto/user.dto";

@Table({ tableName: "users", initialAutoIncrement: "1000" })
class User extends Model<UserDTO> {
  @Column
  user_id: string;

  @Unique
  @Column({ unique: true })
  email: string;

  @Column
  password: string;

  @Column
  user_name: string;

  @Unique
  @Column({ unique: true })
  phone_number: string;

  @ForeignKey(() => Customer)
  @Column
  account_number: string;

  @BelongsTo(() => Customer, { foreignKey: "account_number" })
  customer: Customer;

  @PrimaryKey
  @AutoIncrement
  @Unique
  @Column
  id: number;

  @Column({ allowNull: false, defaultValue: false })
  status: boolean;

  @CreatedAt
  created_at: Date;

  @UpdatedAt
  updated_at: Date;
}

export default User;

Customer模型(修改@HasMany配置)

// Customer模型代码
import {
  Table,
  Column,
  Model,
  ForeignKey,
  PrimaryKey,
  AutoIncrement,
  Unique,
  CreatedAt,
  UpdatedAt,
  HasMany,
} from "sequelize-typescript";
import User from "../user/user.model";
import CustomerDTO from "./dto/customer.dto";

@Table({ tableName: "customers", initialAutoIncrement: "1000" })
class Customer extends Model<CustomerDTO> {
  @Column
  customer_name: string;

  @Unique
  @Column({ unique: true })
  account_number: string;

  @Column
  city: string;

  @Column
  owner_name: string;

  // 关键修改:指定foreignKey和sourceKey
  @HasMany(() => User, { foreignKey: "account_number", sourceKey: "account_number" })
  user: User[];

  @PrimaryKey
  @AutoIncrement
  @Unique
  @Column
  id: number;

  @Column({ allowNull: false, defaultValue: false })
  status: boolean;

  @CreatedAt
  created_at: Date;

  @UpdatedAt
  updated_at: Date;
}

export default Customer;

内容的提问来源于stack exchange,提问作者Ateeb Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 02:20:50