外键约束与应用程序级约束

问题描述 投票:0回答:1

抱歉我的英语不好


@Entity()
export class Account {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ unique: true })
  accountNumber: number;

  @Column({ type: 'double precision' })
  balance: number;

  @OneToOne(() => Currency)
  @JoinColumn({ name: 'currency_signature' })
  currency: Currency;

  @OneToOne(() => User, { nullable: false })
  @JoinColumn()
  user: User;
}



我的 postgres 数据库中有这个实体/表(我使用 typeorm),

      if (!user) throw new BadRequestException('There is no user with that id');
      const account = await this.accountRepository.create({
        ...createAccountDto,
        user,
        currency: { currency_signature: 'USC' },
      });

我有这个创建查询

我的问题是,我需要先检查货币表数据是否存在吗?或者只是让帐户表使用外键约束来处理它,因为帐户表知道我插入的数据是否在货币表中,或者不是来自外键约束?

从我的角度来看,我认为我不需要首先进行查找查询来检查货币签名是否存在,因为如果我进行查找查询来检查货币是否存在,帐户表已经使用foreign_key约束为我检查了它,它只是另一个查询,只是向数据库添加额外的作业?

大家觉得怎么样?

database postgresql foreign-keys constraints
1个回答
0
投票

插入账户前无需检查货币是否存在;

Account
表中的外键约束将为您强制执行。添加单独的检查只会创建不必要的数据库查询。只需处理插入操作期间因外键约束而产生的任何潜在错误。

try {
  const account = await this.accountRepository.save({
    ...createAccountDto,
    user,
    currency: { currency_signature: 'USC' },
  });
} catch (error) {
  if (error.code === '23503') { // Postgres foreign key violation error code
    throw new BadRequestException('Invalid currency');
  }
  throw error;
}
© www.soinside.com 2019 - 2024. All rights reserved.