Knex迁移报错:外键约束引用列不存在(关联表已存在)
解决外键约束引用列不存在的问题
你忽略了最基础的一步:在tables表的迁移里,你直接给reservation_id设置外键约束,但根本没在tables表中创建这个字段。Knex不会自动生成外键对应的列,必须先显式定义列,再绑定外键关系。
之前你尝试调整迁移顺序、合并文件、用async这些操作都没解决问题,因为核心矛盾不是执行顺序或异步问题,而是tables表里压根没有reservation_id这个列,数据库自然找不到它来创建约束。
修改你的tables迁移文件,先添加reservation_id列,再设置外键约束:
exports.up = function(knex) { return knex.schema.createTable("tables", (table) => { table.increments("table_id").primary(); table.string("table_name").notNullable(); table.integer("capacity").unsigned().notNullable(); // 先创建匹配类型的列,再绑定外键 table.integer("reservation_id").unsigned(); table .foreign("reservation_id") .references("reservation_id") .inTable("reservations") .onDelete("cascade"); table.timestamps(true, true); }) }; exports.down = function(knex) { return knex.schema.dropTable("tables"); };
注意这里给reservation_id加上.unsigned(),是因为reservations表的主键reservation_id是自增整数(默认unsigned),保持类型匹配能避免额外的类型错误。如果你的业务要求桌子必须绑定预订,可以给这个列加上.notNullable(),否则保持默认允许为空即可。
内容的提问来源于stack exchange,提问作者fwippy
相关产品推荐
相关产品推荐

