如何在sequelize中将外键引用到另一个外键?
Posted
技术标签:
【中文标题】如何在sequelize中将外键引用到另一个外键?【英文标题】:How to reference foreign key to another foreign key in sequelize? 【发布时间】:2020-06-19 19:09:57 【问题描述】:我有表 3 表。 Versions 表通过 ProjectID 引用了 Project 表。 然后 List 表引用 Versions 表中的 ProjectID(这是一个外键)。
列表表对项目表有“间接”引用
Project Table
---------------
ProjectID
Versions Table
---------------
VersionID
ProjectID (fk to project table) (UNIQUE constraint added)
List Table
--------------
ListID
VersionID (fk to version table)
ProjectID (fk to fk in version table)
在 sequilize 中,我定义了 3 个模型。在列表模型中,这是我通过以下方式创建关联的方式:
// Create foreign keys
List.belongsTo(Versions,
onDelete: "cascade",
foreignKey: "VersionID"
);
// Create foreign keys
ConsolidatedList.belongsTo(Versions,
onDelete: "cascade",
foreignKey: "ProjectID"
);
*
*ISSUE:对于 List 模型,对 ProjectID 字段进行 sequilize 会在 版本表!**
由 sequilize 运行的精确查询(见粗体):
执行(默认):CREATE TABLE IF NOT EXISTS List
(ID
INTEGER auto_increment , ProjectID
INTEGER, VersionID
INTEGER, PRIMARY KEY (ID
), 外键 (ProjectID
) ) REFERENCES Versions
(VersionID
) ON DELETE CASCADE ON UPDATE CASCADE,外键 (VersionID
) REFERENCES Versions
(VersionID
) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB; p>
【问题讨论】:
您的 1 个明确的特定研究非重复问题是什么?问题是什么?你被困在哪里了?你的续集代码在哪里?请在代码问题中提供minimal reproducible example。请不要问重复的问题。在考虑发布之前,请始终在谷歌上搜索任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,带有和不带有您的特定字符串/名称和站点:***.com 和标签;阅读许多答案。请参阅How to Ask 和投票箭头鼠标悬停文本。 PS FK 引用 PK 或 UNIQUE。引用的列列表是否为 FK 无关紧要。 您的 FK 似乎是复合 FK (VersionID, ProjectID)。 FK 必须引用明确声明为 PK/UNIQUE 的列列表。你有吗?这在任何 FK 介绍和您的手册中。这是一个常见问题解答。您的帖子不清楚您的每个 FK、PK 和 UNIQUE 到底是什么。 请通过编辑而非 cmets 进行澄清。 PS 请在声明中准确描述您认为您想说的内容。然后明确您希望发生的 PK、UNIQUE 和 FK 声明以及您认为要声明的内容。因为还不清楚。特别是不清楚您是想要 List 中的 2 个 FK 还是一个复合 FK。提供完整的剪切、粘贴和可运行的minimal reproducible example 进行复制。您是否研究过复合/复合 FK?你明白我之前的评论吗? Re composite/compound FKs. PS 创建表不是查询。 A belongsTo FK 引用目标表 PK。 "By default the foreign key for a belongsTo relation will be generated from the target model name and the target primary key name." "In all cases the default foreign key can be overwritten with the foreignKey option." 这就是你得到的。为什么您认为它会为同名字段创建 FK?请参阅文档。 “在已定义的情况下,它将用于代替目标模型名称。” PS 这不包括你的复合/复合 FK 问题。 这些外键代表什么关系? 【参考方案1】:您需要定义如下所述的 Sequelize 关联 -
List.belongsTo(Versions,
onDelete: "cascade",
foreignKey: "VersionID",
targetKey: "VersionID"
);
List.belongsTo(Versions,
onDelete: "cascade",
foreignKey: "ProjectID",
targetKey: "ProjectID"
);
希望对你有帮助!
【讨论】:
以上是关于如何在sequelize中将外键引用到另一个外键?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 UCanAccess 创建一个包含两个外键引用到另一个表的表?
在mongodb中将一个字段从一个集合复制到另一个集合,外键为混合类型
如何使用 Sequelize 和 mySql 选择外键列的名称?