我的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/