gpt4 book ai didi

mysql - onDelete 级联不适用于 "one to one"- Sequelize.js

转载 作者:行者123 更新时间:2023-11-30 21:30:51 25 4
gpt4 key购买 nike

我的category表有一个外键:name_id,它引用了translation表的id,现在category和translation都有一对一 关系。

我想添加一个 onDelete CASCADE,这样当我删除类别时,翻译也会被删除。

const Translation = sequelize.define('Translation',
{
id: {
type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true,
autoIncrement: true
},
en: DataTypes.STRING(1000),
es: DataTypes.STRING(1000),
pt: DataTypes.STRING(1000)
}
)

const Category = sequelize.define('Category',
{
id: {
type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true,
autoIncrement: true
},
nameId: DataTypes.INTEGER
}
)


Category.belongsTo(Translation, { as: 'name', foreignKey: 'nameId', onDelete: 'cascade' })
Translation.hasOne(Category, { foreignKey: 'nameId', onDelete: 'cascade' })

有什么我想念的吗?

附言其他表也将与翻译相关,这就是为什么外键放在类别中而不是相反。

最佳答案

你的协会是错误的!有了这样的关联定义,你会得到如下方案:

+----------+
| Category |
+----------+
| id |
+----------+
| nameId |
+----------+


+-------------+
| Translation |
+-------------+
| id |
+-------------+
| en |
+-------------+
| es |
+-------------+
| pt |
+-------------+
| nameId | <-- references Category.id
+-------------+

因此,您的 cascade 正在运行,但它会在删除 Translation 时删除孤立的 Categories。要实现您的目标,您必须像这样定义您的关联:

Category.hasOne(Translation, { as: 'name', foreignKey: 'nameId', onDelete: 'cascade' })
Translation.belongsTo(Category, { foreignKey: 'nameId', onDelete: 'cascade' })

编辑:如果您有多个带有翻译的表,您需要删除 belongTo 关联。这些表中的每一个都只有 hasOne,例如:

Category.hasOne(Translation, { as: 'name', foreignKey: 'nameId', onDelete: 'cascade' });
Event.hasOne(Translation, { as: 'description', foreignKey: 'descriptionId', onDelete: 'cascade' });

关于mysql - onDelete 级联不适用于 "one to one"- Sequelize.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56243593/

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