1215 Не удается добавить ограничение внешнего ключа в laravel 5, внешний ключ

#sql #laravel #laravel-5 #migration #database-migration

#sql #ларавель #ларавель-5 #миграция #база данных-миграция #laravel #laravel-5

Вопрос:

2019_04_23_164151_create_contacts_table.php файл миграции

 <?php

 use IlluminateSupportFacadesSchema;
 use IlluminateDatabaseSchemaBlueprint;
 use IlluminateDatabaseMigrationsMigration;

 class CreateContactsTable extends Migration
 {
/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{

    Schema::create('contacts', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('first_name');
        $table->string('last_name');
        $table->string('surname');
        $table->timestamps();
    });

    Schema::create('contacts_relations', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->unsignedInteger('phone_id')->nullable()->default(1);
        $table->unsignedInteger('contact_id')->nullable()->default(1);
    });

    Schema::create('contact_phone', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->integer('phone_number');
        $table->unsignedInteger('contacts_relations_id')->nullable()->default(1);
    });

}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::dropIfExists('contacts');
}}
  

2019_04_24_183110_contacts_relations.php установщик внешнего ключа

  <?php

 use IlluminateSupportFacadesSchema;
 use IlluminateDatabaseSchemaBlueprint;
 use IlluminateDatabaseMigrationsMigration;

 class ContactsRelations extends Migration
 {
/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::table('contacts_relations', function (Blueprint $table) {
        $table->foreign('contact_id')->references('id')->on('contacts');
    });
    Schema::table('contact_phone', function (Blueprint $table) {
        $table->foreign('contacts_relations_id')->references('id')->on('contacts_relations');
    });

}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    //
}
}
  

запустите php artisan migrate: fresh и получите
SQLSTATE [HY000]: Общая ошибка: 1215 Не удается добавить ограничение внешнего ключа (SQL: alter table contacts_relations добавить ограничение contacts_relations_contact_id_foreign ссылки contact_id внешний ключ ( contacts ) id (, ,) при каскадном удалении при каскадном обновлении),,

Ответ №1:

Вы должны убедиться, что все столбцы имеют фактически один и тот же тип. Например, в таблице contacts столбец id является большим целым числом без знака, поэтому, когда вы создаете contact_id столбец в contacts_relations вместо:

 $table->unsignedInteger('phone_id')->nullable()->default(1);
  

это должно быть:

 $table->unsignedBigInteger('phone_id')->nullable()->default(1);
  

Аналогичная вещь для contacts_relations_id столбца

Комментарии:

1. Также, поскольку существует значение по умолчанию, удалите nullable $table-> unsignedBigInteger(‘phone_id’)-> default(1);

2. @Rachid Ну, значение по умолчанию может быть равно 1, но в некоторых случаях вы можете захотеть установить значение null