首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何创建包含多个字段的唯一索引,其中一个字段是外键

如何创建包含多个字段的唯一索引,其中一个字段是外键
EN

Stack Overflow用户
提问于 2020-06-14 14:18:08
回答 3查看 7.2K关注 0票数 14

我试图创建一个包含多个字段的索引,其中一个字段是另一个表的主键。但是,我得到了以下错误:

错误:索引"player_id_UNIQUE“包含实体(收入):player_id中缺少的列

考虑到player_id是我加入的一个重要密钥,我该如何处理它?

代码语言:javascript
运行
复制
import { Column, Entity, Index, JoinColumn, ManyToOne, PrimaryColumn } from "typeorm";
import { PersonPlayer } from "./PersonPlayer";
import { Team } from "./Team";

    @Entity()
    @Index("player_id_UNIQUE", ["player_id", "period", "year"], { unique: true })
    export class Earning {

        @PrimaryColumn({length: 36})
        id: string;

        @Column({nullable: true})
        year: number;

        @Column({type: 'decimal', nullable: true})
        amount: number;

        @Column({nullable: true, length: 45})
        period: string;

        @ManyToOne(() => Team, {nullable: true})
        @JoinColumn({name: 'team_id'})
        team: Team;


        @ManyToOne(() => PersonPlayer, {nullable: true})
        @JoinColumn({name: 'player_id'})
        player: PersonPlayer;

        @Column({nullable: true, length: 45})
        dtype: string;

    }

当我生成这个实体并创建sql表(没有索引)时,我将player_id视为列之一。但是看起来typeorm现在无法通过连接列关系识别player_id存在于实体中的索引。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-02-05 07:19:22

这是完全没有文档的,所以在我无意中发现正确的语法之前,它花了一些时间来玩。实际上,可以在索引定义中使用子属性:

代码语言:javascript
运行
复制
@Index("player_id_UNIQUE", ["player.id", "period", "year"], { unique: true })

这样,在生成的SQL中,player.id自动映射到player_id

代码语言:javascript
运行
复制
CREATE UNIQUE INDEX "player_id_UNIQUE" ON "user_earning" ("player_id", "period", "year")
票数 15
EN

Stack Overflow用户

发布于 2021-11-24 11:41:30

您可以在player_id实体中显式声明Earning。您唯一需要做的更改是添加

代码语言:javascript
运行
复制
@Column()
player_id: number

player定义之前。

通过这种方式,TypeORM将player_id识别为一个有效列,您可以在@Index或@Unique定义中使用它。

这是记录在案的行为:https://typeorm.io/#/relations-faq/how-to-use-relation-id-without-joining-relation

票数 1
EN

Stack Overflow用户

发布于 2021-06-28 17:50:05

代码语言:javascript
运行
复制
@Index(["player.id", "period", "year"])

或者就这么做!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62373766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档