2017-01-20 3 views
0

Я попытался добавить ограничение внешнего ключа с помощью миграции. Миграция завершается без ошибок. Однако, когда база данных проверена, ограничение внешнего ключа не добавляется в таблицу. Другие вещи, указанные в миграциях, работают отлично, за исключением ограничения FK.Переходы Laravel - внешний ключ не применяется к таблице

Мой поворотный стол с ФКС:

Schema::create('book_author', function (Blueprint $table) { 

      $table->integer('book_id')->unsigned(); 
      $table->integer('author_id')->unsigned(); 

      $table->foreign('book_id')->references('id')->on('book')->onDelete('restrict')->onUpdate('cascade'); 
      $table->foreign('author_id')->references('id')->on('author')->onDelete('restrict')->onUpdate('cascade'); 
      $table->primary(['book_id','author_id']); 

     }); 
     Schema::enableForeignKeyConstraints(); 

Автор таблице:

Schema::create('author', function (Blueprint $table) { 
      $table->increments('id'); 
      $table->string('email', 250)->unique(); 
     }); 

Забронировать столик:

Schema::create('book', function (Blueprint $table) { 
      $table->increments('id'); 
      $table->string('title'); 
     }); 

Что я здесь отсутствует?

+0

Какие базы данных? Как вы проверяете, есть ли у вас внешний ключ? – user3158900

+0

Добавляя поле с фиктивными значениями id для обоих столбцов. – paarandika

+0

Является ли ваш настольный движок InnoDB или MyISAM? –

ответ

0

MyISAM не поддерживает внешний ключ: http://dev.mysql.com/doc/refman/5.7/en/myisam-storage-engine.html

Выполните следующую команду, чтобы убедиться, какой двигатель в таблице есть:

SHOW TABLE STATUS WHERE Name = 'book_author' 

Если он показывает MyISAM, у вас есть два параметра:

  1. не использовать FK вообще
  2. Re разместить ваш двигатель

Я бы выбрал вариант 2, потому что вы создаете новую таблицу, и здесь нет риска потерять данные.

Вы можете заставить в ваших миграциях с:

$table->engine = 'InnoDB'; 

В качестве альтернативы, вы можете запустить эту команду вручную:

ALTER TABLE book_author ENGINE=INNODB 
0

Изменить ваш book_author миграция:

Schema::create('book_author', function (Blueprint $table) { 
    $table->integer('book_id')->unsigned()->index(); 
    $table->integer('author_id')->unsigned()->index(); 

    $table->foreign('book_id')->references('id')->on('book')->onDelete('cascade')->onUpdate('cascade'); 
    $table->foreign('author_id')->references('id')->on('author')->onDelete('cascade')->onUpdate('cascade'); 
}); 

Это должно работать.


С другой стороны, обратите внимание, вы нарушаете несколько конвенций Laravel с именами таблиц:

  1. Имя таблиц в форме множественного числа (авторов & книги)
  2. Поворотная таблица (book_author) следует называть (author_book) - алфавитный указатель ority.
Смежные вопросы