使用新的迁移 knexjs 更新外键约束?

Jay*_*713 1 node.js knex.js

我正在尝试在迁移中向外键添加 onUpdate onDelete 级联更改。我怎样才能做到这一点?

原始迁移,无级联

exports.up = function(knex) {

    return knex.schema.createTable('invitations', (table) => {

        table.integer('eventId').unsigned().notNullable();
        table.foreign('eventId').references('id').inTable('events');

    });
};

exports.down = function(knex) {

    return knex.schema.dropTable('invitations');

};
Run Code Online (Sandbox Code Playgroud)

级联新迁移

exports.up = function(knex) {
    return knex.schema.alterTable('invitations', (table) => {

        table.foreign('eventId')
          .onUpdate('CASCADE')
          .onDelete('CASCADE')
            .alter();

    });
};

exports.down = function(knex) {

    return knex.schema.dropColumn('invitations');
  
};
Run Code Online (Sandbox Code Playgroud)

新迁移引发错误“TypeError: table.foreign(...).onUpdate(...).onDelete(...).alter 不是函数”。在不回滚原始迁移的情况下执行此操作的正确方法是什么?

Mic*_*ung 5

由于外键是一次性操作,因此它不支持更改。

最简单的方法:

  • 只需删除外键并创建新外键即可。
  • 要回滚,请删除外键并使用旧设置再次创建。
exports.up = function(knex) {
  return knex.schema.alterTable("invitations", (table) => {
    table.dropForeign("eventId");
    table
      .foreign("eventId")
      .references("events.id")
      .onDelete("CASCADE")
      .onUpdate("CASCADE");
  });
}

exports.down = function(knex) {
  return knex.schema.alterTable("invitations", (table) => {
    table.dropForeign("eventId");
    table
      .foreign("eventId")
      .references("events.id")
      .onDelete("NO ACTION")
      .onUpdate("NO ACTION");
  });
}
Run Code Online (Sandbox Code Playgroud)