Я пытаюсь взять 2 таблицы, в каждой из которых есть столбцы с именем email, password и isBusiness, и автоматически обновить эти значения в одной таблице с именем authentication.
Перенос аутентификации
Schema::create('authentication', function (Blueprint $table) {
$table->increments('auth_id');
$table->string('email');
$table->foreign('email')->references('email')->on('businesses');
$table->foreign('email')->references('email')->on('consumers');
$table->string('password');
$table->foreign('password')->references('password')->on('businesses');
$table->foreign('password')->references('password')->on('consumers');
$table->integer('isBusiness');
$table->foreign('isBusiness')->references('isBusiness')->on('businesses');
$table->foreign('isBusiness')->references('isBusiness')->on('consumers');
$table->timestamps();
});
Ошибка
SQLSTATE[HY000]: General error: 1005 Can't create table `sprout_db`.`#sql-2
7a4_30` (errno: 150 "Foreign key constraint is incorrectly formed")
Деловой стол
Schema::create('businesses', function (Blueprint $table) {
$table->increments('bus_id', 11);
$table->string('bus_name', 50);
$table->string('bus_address', 50);
$table->string('bus_city', 50);
$table->string('bus_prov', 50);
$table->string('bus_postal', 50);
$table->string('bus_phone', 50);
$table->string('email', 50);
$table->string('password', 100);
$table->integer('isBusiness')->default('1');
$table->timestamps();
$table->rememberToken();
$table->engine = 'InnoDB';
});
Потребительский стол
Schema::create('consumers', function (Blueprint $table) {
$table->increments('con_id', 11);
$table->string('con_fname', 50);
$table->string('con_lname', 50);
$table->string('email', 50);
$table->string('password', 100);
$table->integer('isBusiness')->default('0');
$table->timestamps();
$table->rememberToken();
$table->engine = 'InnoDB';
});
это правильный способ сделать это? Назначив по 2 внешних ключа каждому столбцу? У меня просто синтаксическая ошибка или это вообще невозможно сделать.
Тем не менее ... похоже, вам, вероятно, нужно прекратить попытки сделать поля varchar "беззнаковыми". ;)
Я удалил неподписанный. затем он выдал ошибку, которую я смог исправить. Я не получаю новую ошибку при назначении внешних ключей. Я обновил вопрос
Вы должны проиндексировать поля, на которые ссылается внешний ключ (и они должны существовать, поэтому таблицы, на которые есть ссылки, должны быть созданы в первую очередь); но, как я уже сказал в исходном комментарии, наличие ссылки на одно поле на несколько таблиц обычно является очень плохой идеей. Если вы думаете, что это означает «должно соответствовать значению в tableA или tableB», это не так; это означает, что значение должно существовать в ОБЕИХ таблицах (и в зависимости от опций ссылки может «каскадировать» изменения из любой из них).






Просто добавьте к вашему ключу метод index ().
$table->integer('isBusiness')->index()->unsigned();
зачем мне добавлять к нему index() и unsigned()?
Я пробовал безуспешно. Я просто хотел узнать причину этого.
потому что целое число внешнего ключа должно быть индексным в его таблице и беззнаковым
так во всех таблицах ключ должен быть индексированным и беззнаковым? или просто таблица аутентификации?
@Jay обычно внешние ключи не создаются для строковых значений; это разрешено, но относительно дорого по сравнению с целыми числами. Беззнаковая часть не требуется (даже для целых чисел), но поля, на которые ссылается внешний ключ, должны быть проиндексированы.
Я не знаком с laravel, но мне кажется, что вы пытаетесь сделать ссылку на одно поле соответствующим полем в двух разных таблицах? Хотя это возможно, это не лучшая идея.