添加外键引用到 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 值。
我正在使用 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 值。