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
相关产品推荐
相关产品推荐

