添加外键引用到 UUID Knex.js

Add foreign key reference to UUID Knex.js

我正在使用 KnexJS 创建迁移。以下是两个 table 的迁移: Table 任务

exports.up = function(knex) {
  return knex.schema.createTable('tasks', table => {
    table.uuid('id')
    table.string('title').notNullable()
    table.boolean('status').defaultTo(0)
    table.timestamps(true, true)
  })
};

exports.down = function(knex) {
  return knex.schema.dropTable('tasks')
};

Table:子任务

exports.up = function(knex) {
  return knex.schema.createTable('subtasks', table => {
    table.string('title').notNullable()
    table.boolean('status').defaultTo(0)
    table.uuid('task_id').references('id').inTable('tasks')
    table.timestamps(true, true)
  })
};

exports.down = function(knex) {
  return knex.schema.dropTable('subtasks')
};

但是当 运行 迁移时我得到以下错误:

migration file "20211010072346_subtasks.js" failed
migration failed with error: alter table `subtasks` add constraint `subtasks_task_id_foreign` foreign key (`task_id`) references `tasks` (`id`) - ER_CANT_CREATE_TABLE: Can't create table `todo_application`.`subtasks` (errno: 150 "Foreign key constraint is incorrectly formed")

我做错了什么?

谢谢

任务 table 中引用的字段“id”必须是同一类型并标记为 table 的 主键

因为你想使用 uuid - this seems to be possible in Mysql >= 8.

在你的情况下使用 Mysql >= 8 ,你可以使用类似的东西:

exports.up = function(knex) {
  return knex.schema.createTable("tasks", table => {
    table.uuid("id")
      .primary()
      .defaultTo(knex.raw("(UUID())"));
  });
};

如果您不能使用表达式作为默认值 (Mysql 5.7) - 您将必须在客户端代码中提供 uuid 值。