gpt4 book ai didi

sql - 无法实现外键约束 »FK_0e4022833a9efc062c01637e552« - 复合主键有问题?

转载 作者:行者123 更新时间:2023-12-03 17:01:13 25 4
gpt4 key购买 nike

我正在使用 TypeORM 并希望使用当前的三个实体来设计我的数据库。我创建了一个用于复制的存储库

Github reproduction repository

更新

我只用了两个小实体就能够重现它

Very small reproduction repo

下面有更多信息


所以首先我有一个模块实体。这个很小,因为它只存储一些基本字段。

@Entity()
export class Module extends BaseEntity {
@PrimaryGeneratedColumn('uuid')
public id: string;

// some other fields without references
}

接下来我有一个实体。这个持有多个 graphNodes。所以你可以有多个图,每个图都有自己的图节点。图本身需要知道哪个 graphNode 是图中的第一个。所以我尝试设置对 graphNode 实体的外键引用。

  • 可以有多个图
  • 每个图都有一个graphNode作为起始节点
  • 每个图有多个图节点

.

@Entity()
export class Graph extends BaseEntity {
@PrimaryGeneratedColumn('uuid')
public id: string;

@Column({ nullable: true })
public startNodeId?: string;

@ManyToOne(
() => GraphNode,
graphNode => graphNode.id,
)
@JoinColumn({ name: 'startNodeId' })
public startNode: GraphNode;
}

最后一个实体是 graphNodes 实体。每个 graphNode 代表一个图中的一个模块。它还知道其后继 successGraphNodeIderrorGraphNodeId。节点这个实体有一个复合主键很重要,因为如果你想获取一个 graphNode,你也必须传入图形 ID。基本上这些是用例

  • 一个graphNode代表一个模块
  • 每个图有多个图节点
  • graphNode 可以将自己引用为后继者(成功/错误)
  • graphNode 的后继者可以为 null(成功/错误)
  • 一个图节点后继者必须是一个已经存在于这个图中的图节点

.

@Entity()
export class GraphNode extends BaseEntity {
@PrimaryGeneratedColumn('uuid')
public id: string;

@PrimaryColumn()
public graphId: string; // composite key https://github.com/typeorm/typeorm/blob/master/sample/sample27-composite-primary-keys/entity/Post.ts

@ManyToOne(
() => Graph,
graph => graph.id,
)
@JoinColumn({ name: 'graphId' })
public graph: Graph;

@Column()
public moduleId: string;

@ManyToOne(
() => Module,
module => module.id,
)
@JoinColumn({ name: 'moduleId' })
public module: Module;

@Column({ nullable: true })
public successGraphNodeId?: string;

@ManyToOne(
() => GraphNode,
graphNode => graphNode.id,
)
@JoinColumn({ name: 'successGraphNodeId' })
public successGraphNode?: GraphNode;

@Column({ nullable: true })
public errorGraphNodeId?: string;

@ManyToOne(
() => GraphNode,
graphNode => graphNode.id,
)
@JoinColumn({ name: 'errorGraphNodeId' })
public errorGraphNode?: GraphNode;
}

不幸的是,在运行应用程序时我遇到了这个错误

QueryFailedError: Foreign key constraint »FK_0e4022833a9efc062c01637e552« cannot be implemented
at new QueryFailedError (...\references-reproduction\node_modules\typeorm\error\QueryFailedError.js:11:28)
at Query.callback (...\references-reproduction\node_modules\typeorm\driver\postgres\PostgresQueryRunner.js:176:38)
at Query.handleError (...\references-reproduction\node_modules\pg\lib\query.js:145:17)
at Connection.connectedErrorMessageHandler (...\references-reproduction\node_modules\pg\lib\client.js:214:17)
at Connection.emit (events.js:223:5)
at Socket.<anonymous> (...\references-reproduction\node_modules\pg\lib\connection.js:134:12)
at Socket.emit (events.js:223:5)
at addChunk (_stream_readable.js:309:12)
at readableAddChunk (_stream_readable.js:290:11)
at Socket.Readable.push (_stream_readable.js:224:10)

看来我的实体设计不正确。有人知道这里出了什么问题或遗漏了什么吗?如果您需要更多信息或者我是否应该更新我的复制存储库,请告诉我。

提前致谢


更新

我能够用两个小实体重现它。只有一个图之间有关系

@Entity()
export class Graph extends BaseEntity {
@PrimaryGeneratedColumn('uuid')
public id: string;

@Column({ nullable: true })
public startNodeId?: string;

@ManyToOne(
() => Node,
node => node.id,
)
@JoinColumn({ name: 'startNodeId' })
public node: Node;
}

及其节点

@Entity()
export class Node extends BaseEntity {
@PrimaryGeneratedColumn('uuid')
public id: string;

@PrimaryColumn()
public graphId: string;

@ManyToOne(
() => Graph,
graph => graph.id,
)
@JoinColumn({ name: 'graphId' })
public graph: Graph;
}

如前所述,问题似乎依赖于复合主键。我不想将节点的 graphId 主列转换为基本列,因为这将是糟糕的数据库设计...

最佳答案

我认为您的问题不在复合键上。对我来说,您的模型有几个缺陷:

  • GraphNode 都有一个ManyToOne 对彼此。但是根据我从你的解释中收集到的信息,一个节点只附加到一个图,所以在 Graph 中,它实际上应该是一个 OneToMany 代表 的列表节点:
@OneToMany(() => Node)
public nodes: Node[];
  • 注释 ManyToOne 的第二个参数应该是反向属性,但您却用它来引用主键。这是您应该拥有的:
class Graph {
@OneToMany(() => Node, node => node.graph)
public nodes: Node[];
}

class Node {
@ManyToOne(() => Graph, graph => graph.nodes)
public graph: Graph;
}

对于 JoinColumn,typeorm 应该自动获取您指定的每个实体中的主列。

关于sql - 无法实现外键约束 »FK_0e4022833a9efc062c01637e552« - 复合主键有问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60448116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com