LoginSignup
study_matome
@study_matome

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

【Laravel】マイグレーションを実行する際に出たエラーを解決したいと思っています。Illuminate\Database\QueryException SQLSTATE[42S21]: Column already exists: 1060 Duplicate column name

解決したいこと

Laraval usersテーブルを更新したいです。

現在Laravelを使用してマイグレーションファイルをつくっています。
既存の「usersテーブル」に変更を加え、マイグレーションした際にエラーが発生しました。

発生している問題・エラー

 Illuminate\Database\QueryException 

  SQLSTATE[42S21]: Column already exists: 1060 Duplicate column name 'last_name' (SQL: alter table `users` add `last_name` varchar(10) not null, add `first_name` varchar(10) not null, add `employee_num` int unsigned not null, add `admin_flg` tinyint(1) not null default '0', add `job_type_id` bigint unsigned not null, add `hire_date` datetime not null)

  at vendor/laravel/framework/src/Illuminate/Database/Connection.php:712
    708         // If an exception occurs when attempting to run a query, we'll format the error
    709         // message to include the bindings with SQL, which will make this exception a
    710         // lot more helpful to the developer instead of just the database's errors.
    711         catch (Exception $e) {
   712             throw new QueryException(
    713                 $query, $this->prepareBindings($bindings), $e
    714             );
    715         }
    716     }

開発環境

・Windows10
・Laravel
・VScode
・mariadb
・Docker(起動た状態で実行)

エラーに至るまでの流れ

①既存のusersテーブルに変更を加えるため、以下のコマンドを実行

php artisan make:migration add_columns_to_users_table --table=users

→正常にマイグレーションファイルが作成される

②マイグレーションファイルに変更点を追加

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

// メアドは50文字までかつ 正の値かつ 一意に変更
            $table->string('email',50)->unsigned()->unique()->change();

// パスワードは30文字までに変更
            $table->string('password',30)->nullable()->change();

// food_idは正の値かつ user_id の外部キーに指定
            $table->bigInteger('food_id')->unsigned()->foreignId('user_id')->constrained('users');

// デフォルトの名前は削除
            $table->dropColumn('name');
  });
}

③カラムに対する変更ができるようパッケージを追加

composer require doctrine/dbal

→正常に追加される

④マイグレーションしたところエラーが発生

php artisan migrate

調べたこと

・ Illuminate\Database\QueryException
→データベース関係のエラーである

SQLSTATE[42S21]: Column already exists: 1060 Duplicate column name 'last_name' 

→SQLSTATE [42S21]: 列が既に存在します: 1060 列が重複している

考えられること

・重複しているということで同じ処理を書いてしまっていないか確認しましたが
記述自体に重複する点は見られませんでした。
またコメントを頂き、以下のコマンドで確認したところNoのファイルは1つのみ(今回作成したマイグレーションファイル)という状態でした。

$php artisan migrate:status

・新しく作ったマイグレーションファイルがDBに接続できていないのではないかと考え、
PCのコマンドプロンプトでSQLが存在するか調べたところインストールされていない状況でした。
(Dockerを使用してサーバーを立ち上げています)

・使用しているDBが「mariadb」(調べたところSQLと近しいDB)のため、
SQLをインストールすることで解決できるのか分かりかねる状況でした。

同じようなエラーを経験した方で、解決できた方法等ありましたら教えて頂けますと幸いです。

0

3Answer

存在はしてないんでしょうか?
もしかしたら、紹介しているマイグレーションファイルではない内容のsqlが流れている気がするので、

$ php artisan migrate:status

これ実行してNoと表示されているマイグレーションファイルがあるか確認してみてください。

もし複数あれば、マイグレーションファイルを作成した順番にNoのマイグレーションファイルを実行していくことになるので、どっかでフィールドがダブっているんじゃないでしょうか?

1

Comments

  1. @study_matome

    Questioner
    コメント下さり、ありがとうございます!
    コマンドを実行したところ、Noのファイルは1つのみ(今回作成したマイグレーションファイル)の状態でした!
  2. えぇ。。そうですか。。(´·ω·`)
  3. @study_matome

    Questioner
    コメントありがとうございました!
    エラーが解決いたしましたので、ご報告させていただきます。

    phpMyadminというDB視覚化ツールで確認したところ、
    既に新しいusersテーブルが作成されていたため、
    重複していたとのことでした。

    その後以下のコマンドを実行し、ロールバック+マイグレーションを試みました。
    ```
    $ php artisan migrate:fresh
    ```

    その後、emailカラムが他のマイグレーションファイルで
    indexによる制限がついており、文法エラーになりましたが
    indexを外してからカラムの内容を変更したところ
    無事にマイグレーションすることができました。

    マイグレーションファイルの現状を確認するstatusコマンドの存在を忘れていたので、
    コメント頂けて助かりました。
    1つ1つ確認作業をしながら進めていきたいと思います!
    ありがとうございました!

DBに接続してalter tableを行おうして失敗していると思うので、
mariadb内の既存usersテーブルにlast_nameカラムが本当に無いか確認されたほうが良いかもです。

開発環境でDB初期化して問題ないのであれば以下コマンドを試してみてください。

$ php artisan migrate:fresh
1

Comments

  1. @study_matome

    Questioner
    コメントありがとうございました!
    エラーが解決いたしましたので、ご報告させていただきます。

    phpMyadminというDB視覚化ツールで確認したところ、
    既に新しいusersテーブルが作成されていたため、
    重複していたとのことでした。

    その後@TP2さんのコメントにあります、
    以下のコマンドを実行し、ロールバック+マイグレーションを試みました。
    ```
    $ php artisan migrate:fresh
    ```

    その後、emailカラムが他のマイグレーションファイルで
    indexによる制限がついており、文法エラーになりましたが
    indexを外してからカラムの内容を変更したところ
    無事にマイグレーションすることができました。

    コメント頂けて助かりました。
    ありがとうございました!

エラーが解決いたしましたので、ご報告させていただきます。

phpMyadminというDB視覚化ツールで確認したところ、
既に新しいusersテーブルが作成されていたため、
重複していたとのことでした。

その後@TP2さんのコメントにあります、
以下のコマンドを実行し、ロールバック+マイグレーションを試みました。

$ php artisan migrate:fresh

その後、emailカラムが他のマイグレーションファイルで
indexによる制限がついており、文法エラーになりましたが
indexを外してからカラムの内容を変更したところ
無事にマイグレーションすることができました。

コメントを下さったお二方に感謝申し上げます。
ありがとうございました。

0

Your answer might help someone💌