onDelete级联不适用于“一对一”-Sequelize.js

时间:2019-05-21 17:30:33

标签: mysql node.js sequelize.js

我的类别表有一个外键:name_id引用了id表中的translation,现在类别和翻译具有one to one关系。

我想添加一个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' })

有什么我想念的吗?

P.S。其他表也将与翻译相关,这就是为什么将外键放在类别中而不是相反的原因。

1 个答案:

答案 0 :(得分:0)

您的联系是错误的!有了这样的关联定义,您将获得以下方案:

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


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

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

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' });