【问题标题】:How to create tables that refer to each other?如何创建相互引用的表?
【发布时间】:2018-10-03 03:24:20
【问题描述】:
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);
    });
};

alter table "courses" 添加约束 "courses_id_foreign" 外键 ("id") 引用 "files" ("course_id") - 关系 "files" 不存在

我想创建两个相互引用的表。如何正确处理

【问题讨论】:

    标签: javascript node.js postgresql knex.js


    【解决方案1】:

    您不应该在表格之间进行双向链接。这通常是糟糕的数据库设计的标志。

    在这种情况下,我想你应该有多对一的关系,当然可以有多个文件。

    在这种情况下,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 表的主键。 .

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-26
      • 2021-01-25
      • 1970-01-01
      • 1970-01-01
      • 2020-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多