【问题标题】:SET FOREIGN_KEY_CHECKS = 0 not working in Sequelize migrationSET FOREIGN_KEY_CHECKS = 0 在 Sequelize 迁移中不起作用
【发布时间】:2021-03-15 13:46:07
【问题描述】:

这是我的功能:

up: queryInterface => {
  return queryInterface.sequelize.query('SET FOREIGN_KEY_CHECKS = 0')
   .then(() => queryInterface.dropTable('my_table'));
},

此查询在表中有效:

SET FOREIGN_KEY_CHECKS = 0; 
DROP TABLE IF EXISTS `my_table`;

错误是

无法删除或更新父行:外键约束失败

【问题讨论】:

  • 我对 sequelize 毫无头绪,但作为 DBA,我可以告诉你,set foreign_key_checks=0 语句具有会话范围。如果可能,只需在同一个会话中执行这两个语句。
  • @fancyPants 看来您不能在同一个会话中执行两个语句。我从其他表中删除了引用并且它起作用了。
  • 是否有其他人/其他人同时在数据库中工作?如果是,那么删除引用不能成为解决方案。这也是我对 Zendem 的回答投反对票的原因。
  • 我没有注意到有两个表引用了我的。我从它们中删除了列,它起作用了。 SET FOREIGN_KEY_CHECKS = 0 是不安全的。
  • 您宁愿完全没有参照完整性?你删除列?好吧。祝你有美好的一天。

标签: mysql sql sequelize.js sequelize-cli


【解决方案1】:

如果你想在 Sequelize 迁移中移除一个约束/外键,你需要使用这个:

// an example of table projects and users
await queryInterface.removeConstraint('projects', 'projects_ibfk_1'); // tableName, constraintId
await queryInterface.dropTable('users');

最好执行 'SET FOREIGN_KEY_CHECKS = 0'。

如果您不知道约束 ID(在我的例子中是 projects_ibfk_1),请使用:

const refs = await queryInterface.getForeignKeyReferencesForTable('projects');
console.log(refs);

【讨论】:

    猜你喜欢
    • 2015-04-13
    • 2016-08-07
    • 2013-06-18
    • 1970-01-01
    • 2014-07-28
    • 2013-01-05
    • 2017-06-26
    • 2014-09-04
    • 1970-01-01
    相关资源
    最近更新 更多