使用Knex创建带关联的表时报外键不兼容错误,无法创建全部表
问题原因
- 外键类型不兼容:Knex中
increments()方法创建的自增主键为无符号整数(UNSIGNED INT)类型,当前代码中userId、postId等外键字段通过integer()创建时默认是有符号整数(SIGNED INT),二者类型不匹配导致外键约束创建失败,并非表中不存在id字段。 - evaluations表存在语法错误,即使外键问题修复也无法正常创建:
- 拼写错误:
table.inplements('id')应为table.increments('id') - 方法名错误:Knex无
int()方法,整数字段需使用integer() - 参数格式错误:
decimal('rate', (1,2))的参数不需要额外括号包裹,且decimal第一个参数为总精度(整数位+小数位总长度),第二个参数为小数位长度,例如存最多1位整数2位小数需传3,2
- 拼写错误:
- 所有外键字段未标注无符号属性,和主键类型不匹配。
修复方案
1. 修正posts表的外键字段
将posts表中userId字段的定义调整为:
table.integer('userId').unsigned().references('id').inTable('users').notNull()
2. 修正evaluations表的全部错误
完整修正后的evaluations表迁移代码如下:
exports.up = function(knex) { return knex.schema.createTable('evaluations', table => { table.increments('id').primary() table.integer('review').notNull() table.decimal('rate', 3, 2).notNull() // 可根据实际评分范围调整精度参数 table.integer('postId').unsigned().references('id') .inTable('posts').notNull() table.integer('userId').unsigned().references('id') .inTable('users').notNull() table.timestamp('deletedAt') table.timestamp('updatedAt') }); }; exports.down = function(knex) { return knex.schema.dropTable('evaluations'); };
3. 重新执行迁移
先运行knex migrate:rollback回滚之前执行失败的迁移,再重新运行knex migrate:latest即可完成三张表的创建。
内容的提问来源于stack exchange,提问作者user11240162
相关产品推荐
相关产品推荐

