我正在尝试在迁移中向外键添加 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 不是函数”。在不回滚原始迁移的情况下执行此操作的正确方法是什么?
由于外键是一次性操作,因此它不支持更改。
最简单的方法:
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)