Код ошибки SQL 1064 при создании внешних ключей Laravel

#php #sql #laravel

#php #sql #laravel

Вопрос:

У меня есть таблица bankaccounts. Там у меня есть столбец ‘user_id’, который ссылается на идентификатор в таблице user.

Теперь я хочу добавить внешний ключ в этот столбец, но затем я получаю эту ошибку.

> SQLSTATE[42000]: синтаксическая ошибка или нарушение доступа: 1064 У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса, который следует использовать рядом с ‘unsigned not null, created_at timestamp null, updated_at timestamp null) def’ в строке 1 (SQL: create table bankaccounts ( id bigint unsigned not null auto_increment primary key, user_id int unsigned not null, accountnumber varchar(191) not null , bank varchar(191) not null, user_name varchar(191) без знака not null, created_at отметка времени null, updated_at отметка времени null) набор символов по умолчанию utf8mb4 сопоставляет ‘utf8mb4_unicode_ci’)

Я уже пробовал это с минимальными изменениями. Добавляйте внешний ключ только в столбец user_id.

У меня стандартная миграция пользователей Laravel, а это миграция банковских счетов.

 public function up()
{
    Schema::create('bankaccounts', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->integer('user_id')->unsigned();
        $table->string('accountnumber')->unique();
        $table->string('bank');
        $table->string('user_name');
        $table->timestamps();
    });

    Schema::table('bankaccounts', function($table) {
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        $table->foreign('user_name')->references('name')->on('users')->onDelete('cascade');
    });
}
  

Я понятия не имею, что я делаю не так, потому что я вижу онлайн-руководства, которые также пробуют это с идентификатором из таблицы users, и они преуспевают.

Ответ №1:

У вас не может быть «неподписанного» varchar.

У вас есть

 user_name varchar(191) unsigned not null
  

измените его на

 user_name varchar(191) not null
  

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

1. При миграции laravel это вызвано $table->string('user_name')->unsigned();

2. Технически, поскольку это Laravel, OP необходимо изменить $table->string('user_name')->unsigned(); на $table->string('user_name'); .

3. Я отредактировал свой пост. Даже без имени это все равно не будет работать. Теперь я получаю эту ошибку: Общая ошибка: 1215 не удается добавить ограничение внешнего ключа (SQL: alter table bankaccounts добавляет ограничение bankaccounts_user_id_foreign ссылок на внешний ключ ( user_id ) users ( id ) при каскадном удалении)

4. @idontunderstandarrays Это другая проблема, и ее следует задать в другом вопросе.

5. @EdCottrell Хорошо, я изменил его в соответствии с вашим предложением, удалил внешний ключ для идентификатора пользователя, и я также получаю ту же ошибку.