微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果外键约束处于活动状态,则通过顺序迁移来更改表的过程

如何解决如果外键约束处于活动状态,则通过顺序迁移来更改表的过程

我们在nodejs项目中使用sequelize和Umzug进行所需的数据库更改。非常重要的一点是,在我们讨论解决方案的多个有效使用实例的迁移时,数据库间的所有数据都应能够从一个版本迁移到另一个版本。

只要没有外键约束,Sequelize就能很好地发挥作用。

在我们的场景中,我们有一个现有的表“ devices”,该表的外键约束设置为另一个表“ basedata”->“ id”。现在,我需要删除表“ devices”中的一个非null约束。我尝试使用以下迁移脚本执行此操作:


const { Sequelize } = require('sequelize');

module.exports = {
  up: async (queryInterface) => {
    await queryInterface.changeColumn('devices','basedataId',{
      type: Sequelize.BIGINT,allowNull: true,references: {
        model: 'basedata',key: 'id'
      }
    });
  }
};

此操作失败,并显示以下错误

  <rejected> ForeignKeyConstraintError [SequelizeforeignKeyConstraintError]: sqlITE_CONSTRAINT: FOREIGN KEY constraint Failed
      at Query.formatError (C:\....\node_modules\sequelize\lib\dialects\sqlite\query.js:366:18)
      at Query._handleQueryResponse (C:\....\node_modules\sequelize\lib\dialects\sqlite\query.js:72:18)
      at Statement.afterExecute (C:\....\node_modules\sequelize\lib\dialects\sqlite\query.js:246:27) {
    parent: [Error: sqlITE_CONSTRAINT: FOREIGN KEY constraint Failed] {
      errno: 19,code: 'sqlITE_CONSTRAINT',sql: 'DROP TABLE `devices`;'
    },original: [Error: sqlITE_CONSTRAINT: FOREIGN KEY constraint Failed] {
      errno: 19,sql: 'DROP TABLE `devices`;',parameters: undefined,fields: undefined,table: undefined,value: undefined,index: undefined,reltype: undefined
  }
  }
} reason: SequelizeforeignKeyConstraintError: sqlITE_CONSTRAINT: FOREIGN KEY constraint Failed

在我看来,sequelize会构建更改后的表,并在将新表重命名为旧名称之前尝试删除现有表。由于不再满足约束条件,因此失败。

问题解决我必须迁移/更改具有外键约束的现有表的情况的预期方法是什么?

最好的问候

BoxSon

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。