查看了一些其他帖子询问错误“列“column_name”在外键约束中引用不存在“,但没有一个答案/情况似乎完全匹配:
目前有两个迁移文件:
20210123122225_创建预订表. js
exports.up = function (knex) {
return knex.schema.createTable("reservations", (table) => {
table.increments("reservation_id").primary();
table.string("first_name").notNullable();
table.string("last_name").notNullable();
table.string("mobile_number").notNullable();
table.date("reservation_date").notNullable();
table.time("reservation_time").notNullable();
table.integer("people");
table.timestamps(true, true);
});
};
exports.down = function (knex) {
return knex.schema.dropTable("reservations");
};
2022111222830_表格. js
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
.foreign("reservation_id")
.references("reservation_id")
.inTable("reservations")
.onDelete("cascade");
table.timestamps(true, true);
})
};
exports.down = function(knex) {
return knex.schema.dropTable("tables");
};
运行迁移会导致:
迁移文件“20210123122225_createReservationsTable.js”失败迁移失败,错误为:变更表“tables”添加约束条件“tables_reservation_id_foreign”外键(“reservation_id”)在删除级联时引用“reservations”(“reservation_id”)-外键约束条件中引用的列“reservation_id”不存在
我想也许“reservations”表是在“tables”表之后创建的。但据我所知,迁移是按照文件名的顺序运行的。考虑到“reservations”表的迁移文件的日期更早,它应该首先运行。我以前也做过这种完全相同的迁移方法,没有遇到过问题。
无论哪种方式,我都尝试先运行“reservations”表的迁移,然后单独运行“tables”表的迁移。同样的问题。
我在前面的问题中尝试了其他建议,比如将两个表创建放在同一个文件中,使用异步标记来避免争用条件,但仍然出现相同的错误。
我开始觉得我错过了一些很明显的东西。
2条答案
按热度按时间vxqlmq5t1#
当然,我在发布问题后五分钟就想通了,在兜了一个小时的圈子之后。
我只是忘了声明外键的实际列!
svmlkihl2#
.down
操作应在拖放中提到“cascade”。删除
reservations
需要删除tables
,或至少删除其FK依赖项。您有一个...25...reservations文件和一个...30.tables文件。
我不清楚当...25...reservations
.up
操作抛出FK错误时,数据库的状态是什么。我们都希望它(A.)不关心tables
,(B.)运行良好,与tables
是否存在无关。也许在某些ALTER语句周围有一个开始... COMMIT事务?
要调试此问题,
1.记录正在运行的内容。
1.从
psql>
提示符手动重现故障现象。