Как создавать таблицы, которые ссылаются друг на друга? - PullRequest
0 голосов
/ 02 октября 2018
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);
    });
};

изменить таблицу «курсы» добавить ограничение1005 * Я хочу создать две таблицы, которые ссылаются друг на друга.Как это сделать правильно

1 Ответ

0 голосов
/ 02 октября 2018

Вы не должны делать двустороннюю связь между таблицами.Это обычно признак плохого дизайна базы данных.

В этом случае, я полагаю, у вас должно быть отношение «многие к одному», когда курс может иметь несколько файлов.

В этом случае таблица 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..

Отказ от ответственности: я даже не пытался запустить написанный код, но он должен дать основную идею.

...