クマのブログ

つまづいたところ、学びを書いていきます

SQLSTATE[42S01]: Base table or view already exists: 1050 Table

前提

状況

  • Techpitで学習中、初めてLaradockを使ってDockerをインストール
  • Windowsなので、Docker Toolbox使用
  • Laravel上でMySQLのテーブルを作成する「マイグレーション」を実施する際に、少しつまづいたのでメモ

やりたかったこと

以下コードをLaravel上のdatabase/migrationsフォルダ直下に作ったファイルに記述

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateAppTables extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        // テーブル①
        Schema::create('primary_categories', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        // テーブル①
        Schema::dropIfExists('prmary_categories');
    }
}

そして、

1. MySQL上でテーブルが正しく作れるか確認すべく

php artisan migrate

を実行し、MySQL上に"primary_categories"という名前のテーブルを作る

2. 次に、作成したテーブルを

php artisan migrate:rollback

ロールバックし問題なく実行できるか確認

3. 1.2.の実行結果を確認したのち、1.を再度実行

困ったこと

2.のロールバック実行後、

root@**********:/var/www# php artisan migrate:rollback
Rolling back: 2019_08_19_000000_create_failed_jobs_table
Rolled back:  2019_08_19_000000_create_failed_jobs_table (0.06 seconds)
Rolling back: 2014_10_12_100000_create_password_resets_table
Rolled back:  2014_10_12_100000_create_password_resets_table (0.01 seconds)
Rolling back: 2014_10_12_000000_create_users_table  // 作成したテーブルをロールバック
Rolled back:  2014_10_12_000000_create_users_table (0.01 seconds)  // 作成したテーブルをロールバック

と表示されたが、MySQLを確認すると

f:id:kuma_kuma0121:20210427222455p:plain

'primary_categories'テーブルが残っていた。(なぜだ。。。)

試しに1. を実行すると

php artisan migrate

を実行したところ、以下エラーが発生。

f:id:kuma_kuma0121:20210427220118p:plain

エラー文:SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'primary_categories' already exists

要約:既に'primary_categories'はあるよ!

「なぜかわからんけどロールバックができていないからか…」

とにかく、エラー対応。

やったこと

なぜロールバックできていないか考える

ロールバックするLaravel上のコードに問題があるか可能性が高いと推測しコードを確認

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        // テーブル①
        Schema::dropIfExists('prmary_categories');
    }

結果:〇

見つけました。"i"が抜けておりました。

正:primary_categories

誤:prmary_categories

  • 実はコレ、「やりたかったこと」の2.実行前に気づいて、修正したところでした。
  • 結論、タイポしていたせいで1.のマイグレでロールバック不可能なテーブルを作成してしまい、2.以降の実行の妨げになった、ということ。

対応策

MySQL上で"primary_categories"テーブルを削除

f:id:kuma_kuma0121:20210427223347p:plain

その後、再度マイグレーションロールバックを実行し、どちらも正常に処理できることを確認

備考

  • 原因はタイポですが、解決までのアプローチが非常に早くなったことを実感
  • 学習したてはエラーが発生した瞬間、エラー文を読むが理解できずGoogleにすべて頼っていたエラー対応。
  • 今回は「ロールバックができない」という事象から、Googleを頼る前に異常の箇所を推測し、解決することができたことは非常に大きい。