Я хочу перенести БД, содержащую три таблицы:
Ad_users
Ad_groups
Ad_usersxad_groups
Последний, очевидно, является соединительной таблицей, содержащей всего две ФК, ссылающиеся на ПК двух других таблиц. Теперь у меня есть следующая проблема, это миграция для таблицы ad_users:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateAdusersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('Ad_users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('common_name');
$table->string('location');
$table->string('description');
$table->integer('postalcode');
$table->string('physical_delivery_office_name');
$table->string('telephone_number');
$table->string('initials');
$table->string('street_address');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('Ad_users');
}
}
$table->bigIncrements('id');
создает столбец типа bigint(20) unsigned
. Столбец в соединительной таблице, содержащий FK, должен, конечно, быть точно такого же типа. Однако внешний ключ, конечно, не может быть первичным ключом соединительной таблицы, и поэтому я не могу использовать синтаксис $table->bigIncrements
, но instad должен использовать синтаксис $table->bigInteger
, как показано здесь при миграции для таблицы Ad_usersxad_groups:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateAdusersxadgroupsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('Ad_usersxad_groups', function (Blueprint $table) {
$table->bigInteger('Ad_user_id');
$table->bigInteger('Ad_group_id');
$table->foreign('Ad_user_id')->references('id')->on('Ad_users');
$table->foreign('Ad_group_id')->references('id')->on('Ad_groups');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('Ad_usersxad_groups');
}
}
Возникающая проблема: $table->bigInteger
создает столбец типа bigint(20)
. Кажется, что это не совместимо с типом bigint(20) unsigned
внутри столбца PK исходных таблиц. Artisan выдает следующую ошибку, когда я пытаюсь запустить миграцию:
SQLSTATE[HY000]: General error: 1005 Can't create table `aetherdb`.`ad_usersxad_groups` (errno: 150 "Foreign key constraint is incorrectly fo
rmed") (SQL: alter table `Ad_usersxad_groups` add constraint `ad_usersxad_groups_ad_user_id_foreign` foreign key (`Ad_user_id`) references `A
d_users` (`id`))
Есть ли способ решить эту проблему, кроме простого отказа от типа bigint(20) unsigned
в столбцах PK исходных таблиц ? Можно ли как-то добавить unsigned
к столбцам без первичного ключа в соединительной таблице?