【问题标题】:Sequelize.js: ER_ROW_IS_REFERENCED: Cannot delete or update a parent row: a foreign key constraint failsSequelize.js:ER_ROW_IS_REFERENCED:无法删除或更新父行:外键约束失败
【发布时间】:2014-11-11 13:19:26
【问题描述】:

我的代码是:

DB.sequelize.query('SET FOREIGN_KEY_CHECKS = 0').complete(function(err) {
  if (err) {
    return done(err);
  }
  DB.sequelize.drop();
  return DB.sequelize.sync().complete(function(err) {
    if (err) {
      return done(err);
    }
  });
});

我有一些外键约束,但我认为SET FOREIGN_KEY_CHECKS = 0 会忽略这一点,让我放弃。相反,我得到的错误是:ER_ROW_IS_REFERENCED: Cannot delete or update a parent row: a foreign key constraint fails

【问题讨论】:

    标签: sequelize.js


    【解决方案1】:

    试试下面的。

    DB
        .sequelize
        .query('SET FOREIGN_KEY_CHECKS = 0', null, {raw: true})
        .success(function(results) {
            DB.sequelize.sync({force: true});
        });
    

    同步的“force: true”选项会将“DROP TABLE IF EXISTS”添加到 create 语句中,因此这应该可以实现您尝试使用 drop() 执行的操作。

    这个答案也值得考虑:Sequelize doesn't create foreign keys as constraints

    【讨论】:

      【解决方案2】:

      对于使用 sequelize 3.15.x 的任何人,他们都有refactored their query method,因此初始 SQL 语句之后的任何选项都包含在一个选项对象中。因此答案看起来像这样:

      DB
          .sequelize
          .query('SET FOREIGN_KEY_CHECKS = 0', {raw: true})
          .then(function(results) {
              DB.sequelize.sync({force: true});
          });
      

      【讨论】:

      • 这对我不起作用,直到我在 sequelize 初始化对象中将 pool 设置为 false。
      【解决方案3】:

      更简洁的方式:

      const forceSync = async () => {
        await db.sequelize.query('SET FOREIGN_KEY_CHECKS = 0');
        await db.sequelize.sync({ force: true });
        await db.sequelize.query('SET FOREIGN_KEY_CHECKS = 1'); // setting the flag back for security
      };
      
      

      【讨论】:

        猜你喜欢
        • 2017-06-11
        • 1970-01-01
        • 2019-05-25
        • 2018-05-12
        • 2017-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多