postgresql Knex迁移外键约束条件不存在(引用的表是否存在?)

iezvtpos  于 2022-11-23  发布在  PostgreSQL
关注(0)|答案(2)|浏览(118)

查看了一些其他帖子询问错误“列“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”表的迁移。同样的问题。
我在前面的问题中尝试了其他建议,比如将两个表创建放在同一个文件中,使用异步标记来避免争用条件,但仍然出现相同的错误。
我开始觉得我错过了一些很明显的东西。

vxqlmq5t

vxqlmq5t1#

当然,我在发布问题后五分钟就想通了,在兜了一个小时的圈子之后。
我只是忘了声明外键的实际列!

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");
};
svmlkihl

svmlkihl2#

.down操作应在拖放中提到“cascade”。
删除reservations需要删除tables,或至少删除其FK依赖项。
您有一个...25...reservations文件和一个...30.tables文件。
我不清楚当...25...reservations .up操作抛出FK错误时,数据库的状态是什么。我们都希望它(A.)不关心tables,(B.)运行良好,与tables是否存在无关。
也许在某些ALTER语句周围有一个开始... COMMIT事务?
要调试此问题,
1.记录正在运行的内容。
1.从psql>提示符手动重现故障现象。

相关问题