Как исправить ошибку «Невозможно добавить ограничение внешнего ключа» (строковые столбцы) - PullRequest
0 голосов
/ 04 апреля 2019

Мне нужно создать внешний ключ между двумя таблицами. Аналогично этому запросу SQL:

`alter table `katalog` add constraint `katalog_atribut_foreign` 
foreign key (`atribut`) references `polozka_sabl` (`atribut`)`

Ошибка, которую я продолжаю получать:

Illuminate\Database\QueryException  : SQLSTATE[HY000]: General 
error: 1215 Cannot add foreign key constraint (SQL: alter table 
`katalog` add constraint `katalog_atribut_foreign` foreign key 
(`atribut`) references `polozka_sabl` (`atribut`))

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

2019_04_02_230803_create_katalog.php:

public function up()
    {
        Schema::create('katalog', function (Blueprint $table) {
            $table->engine = 'InnoDB';
            $table->string('atribut')->collate('utf8_general_ci');
            $table->string('popis');
            $table->timestamps();
        });
         Schema::table('katalog', function($table) {
            $table->primary('atribut');
            $table->foreign('atribut')->references('atribut')->on('polozka_sabl');
        });
    }

2019_04_02_230754_create_polozka_sabl.php:

    public function up()
    {
        Schema::create('polozka_sabl', function (Blueprint $table) {

            $table->engine = 'InnoDB';
            $table->bigInteger('idproj')->unsigned();
            $table->string('atribut')->collate('utf8_general_ci');
            $table->primary(['idproj', 'atribut']);
            $table->timestamps();
        });

        Schema::table('polozka_sabl', function($table) {

            $table->foreign('idproj')->references('idproj')->on('projekt');
        });
    }

Вы можете мне помочь? Я пытался гуглить, но на самом деле ничего не исправило

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019

Указанный столбец должен иметь индекс:

Schema::create('polozka_sabl', function (Blueprint $table) {
    $table->engine = 'InnoDB';
    $table->bigInteger('idproj')->unsigned();
    $table->string('atribut')->collate('utf8_general_ci')->index();
    $table->primary(['idproj', 'atribut']);                ^^^^^^^
    $table->timestamps();
});
0 голосов
/ 04 апреля 2019

В вашей первой миграции:

$table->primary('atribut');
$table->foreign('atribut')->references('atribut')->on('polozka_sabl');

Тот же столбец, что и первичный и внешний ключ.Это может быть проблемой.Попробуйте удалить первичный ключ.Если вам действительно нужно, чтобы это было уникальным, вы можете сделать его уникальным ключом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...