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

Update foreign key constraint with new migration knexjs?

我正在尝试向迁移中的外键添加 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');

};

带层叠的新迁移

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');
  
};

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

由于外键是一次性的,不支持修改

最简单的方法:

  • 只需删除外键并创建新的。
  • 要回滚,删除外键并使用旧设置重新创建。
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");
  });
}