You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Knex.js中创建指向UUID字段的外键时报errno 150错误如何解决?

错误原因及解决方法

你遇到的外键约束错误有以下几个常见诱因:

  • 父表tasks的id字段未设置为主键,外键必须关联父表的主键或者具备唯一约束的字段,你当前的tasks表中id只是普通uuid字段,没有主键约束,是导致报错的核心原因。
  • 迁移文件执行顺序错误,必须保证tasks表的迁移文件时间戳早于subtasks表的迁移文件,否则创建subtasks时父表还不存在也会触发该错误。你给出的subtasks迁移文件名为20211010072346_subtasks.js,需要确认tasks迁移文件的时间戳是否小于该数值。
  • 关联字段属性不匹配,外键字段和被关联字段的类型、非空约束等属性必须完全对齐。

修正后的迁移代码

Tasks表

exports.up = function(knex) {
  return knex.schema.createTable('tasks', table => {
    // 新增主键约束和非空约束,MySQL环境下可以加.defaultTo(knex.raw('UUID()'))自动生成uuid
    table.uuid('id').primary().notNullable()
    table.string('title').notNullable()
    table.boolean('status').defaultTo(0)
    table.timestamps(true, true)
  })
};

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

Subtasks表

exports.up = function(knex) {
  return knex.schema.createTable('subtasks', table => {
    table.string('title').notNullable()
    table.boolean('status').defaultTo(0)
    // 可按需添加非空约束,保证字段属性和tasks.id完全对齐
    table.uuid('task_id').notNullable().references('id').inTable('tasks')
    table.timestamps(true, true)
  })
};

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

额外检查项

如果修改后仍报错,可以确认数据库配置中表引擎是否为InnoDB,MyISAM引擎不支持外键约束。

内容的提问来源于stack exchange,提问作者Sujan Shrestha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 17:18:03