【问题标题】:Add foreign key reference to UUID Knex.js添加对 UUID Knex.js 的外键引用
【发布时间】:2021-11-29 10:31:11
【问题描述】:

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

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')
};

表格:子任务

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")

我在这里做错了什么?

谢谢

【问题讨论】:

    标签: mysql database-migration knex.js


    【解决方案1】:

    tasks 表中引用的字段“id”必须是同一类型,并标记为该表的主键

    既然要使用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 值。

    【讨论】:

      猜你喜欢
      • 2018-02-02
      • 1970-01-01
      • 2019-07-24
      • 2021-05-06
      • 2016-12-10
      • 2016-01-11
      • 2021-04-02
      • 1970-01-01
      • 2015-09-29
      相关资源
      最近更新 更多