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

标签 mysql node.js sequelize.js

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

相关文章:

mysql - 错误 #1005 - 无法创建表(错误号 : 150)

javascript - ./~/node-env-file/lib/index.js 中的错误找不到模块 : Error: Cannot resolve module 'fs'

mysql - 如何在有条件的 Sequelize 中使用 LEFT JOIN?

mysql - 按列的顺序方式选择sql中的行

php - 神秘错误:mysql_num_rows()期望参数1为资源

mysql - 有没有办法自动修剪数据

子文件夹中的 Node.js npm 依赖项

javascript - 如何暂停 Javascript MAP 直到 Firebase Firestore 完成? Promise、异步/等待或两者兼而有之

sequelize.js - Sequelize 如何将复杂的原始查询转换为 Sequelize 查询

mysql - Sequelizejs 中的外键始终为空