exports.up = async function (knex, Promise) {
await knex.schema.createTable('courses', function (table) {
table.primary('id');
table.string('name').notNullable();
table.text('description').notNullable();
table.integer('id').references('files.course_id').notNullable();
table.timestamps(true, true);
});
};
exports.up = async function (knex, Promise) {
await knex.schema.createTable('files', function (table) {
table.increments().primary();
table.string('name').notNullable();
table.string('path').notNullable();
table.text('description').notNullable();
table.integer('course_id').references('courses.id').notNullable();
table.timestamps(true, true);
});
};
在表“ courses”中添加约束“ courses_id_foreign”外键(“ id”)引用“文件”(“ course_id”)-关系“文件”不存在
我想创建两个相互引用的表。正确的做法
答案 0 :(得分:0)
您不应在表之间进行两种方式的链接。这通常表明数据库设计不佳。
在这种情况下,我想您应该具有多对一关系,其中当然可以有多个文件。
在这种情况下,files
表应该具有指向courses
的外键。
exports.up = async function (knex, Promise) {
await knex.schema.createTable('courses', function (table) {
table.increments('id'); // increments is automatically set to be primary key
});
await knex.schema.createTable('files', function (table) {
table.increments('id');
table.integer('course_id').unsigned().notNullable()
.references('id').inTable('courses');
});
}
如果您希望每门课程只能有一个文件,那么您应该具有从courses
到files
的外键。
exports.up = async function (knex, Promise) {
await knex.schema.createTable('files', function (table) {
table.increments('id');
});
await knex.schema.createTable('courses', function (table) {
table.increments('id');
table.integer('file_id').unsigned().notNullable()
.references('id').inTable('files');
});
}
但是,如果要执行此操作,则需要先创建一个没有外键的表,然后再创建第二个表,然后再添加指向第二个表的外键。
这应该或多或少地完成
exports.up = async function (knex, Promise) {
await knex.schema.createTable('courses', function (table) {
table.increments('id');
});
await knex.schema.createTable('files', function (table) {
table.increments('id');
table.integer('course_id').unsigned().notNullable()
.references('id').inTable('courses');
});
await knex.schema.table('courses', function (table) {
table.integer('file_id').unsigned().notNullable()
.references('id').inTable('files');
});
}
上面的代码中还存在其他错误,例如您正试图将course
表的主键设置为引用files
表的course_id
,而该指针指向该表的主键。 courses
表...
免责声明:我什至没有尝试运行我编写的代码,但是它应该给出基本的想法。