如何在Knex.js中通过新迁移为外键添加onUpdate/onDelete级联规则
Knex.js 为已有外键添加级联操作的正确迁移方案
错误原因
你遇到的报错有两个核心问题:
- Knex的外键约束定义不支持
alter()方法,无法直接修改已存在的外键规则,必须先删除旧约束再创建新约束 - 你编写的回滚方法逻辑错误,
dropColumn()是用于删除表字段的方法,不能传入表名参数
正确迁移代码
exports.up = function(knex) { return knex.schema.alterTable('invitations', table => { // 删除原有无等级联规则的旧外键约束,Knex默认生成的约束名格式为 表名_字段名_foreign table.dropForeign('eventId'); // 新建带级联配置的外键 table.foreign('eventId') .references('id') .inTable('events') .onUpdate('CASCADE') .onDelete('CASCADE'); }); }; exports.down = function(knex) { return knex.schema.alterTable('invitations', table => { // 回滚时删除带级联的新外键 table.dropForeign('eventId'); // 恢复最初的无等级联外键配置 table.foreign('eventId').references('id').inTable('events'); }); };
注意事项
- 如果你之前创建外键时自定义过约束名,需要将
table.dropForeign('eventId')改为table.dropForeign('你的自定义约束名'),否则会提示找不到约束 - 执行迁移前请确认
invitations表中所有eventId的值都存在于events表的id字段中,否则新建外键时会触发数据合法性校验失败 - MySQL数据库如果开启了外键约束检查遇到删除旧外键失败的情况,可以在操作前临时关闭约束检查,操作完成后再恢复,全程需保证数据一致性
内容的提问来源于stack exchange,提问作者Jayg713
相关产品推荐
相关产品推荐

