如何创建相互引用的表?

时间:2018-10-02 18:19:15

标签: javascript node.js postgresql knex.js

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”)-关系“文件”不存在

我想创建两个相互引用的表。正确的做法

1 个答案:

答案 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');
  });

}

如果您希望每门课程只能有一个文件,那么您应该具有从coursesfiles的外键。

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表...

免责声明:我什至没有尝试运行我编写的代码,但是它应该给出基本的想法。