web-dev-qa-db-ja.com

Laravel移行テーブルは既に存在しますが、古いものではなく新しいものを追加したい

以前にユーザーテーブルを作成しました。これで、スキーマ内に新しいブックテーブルを作成するための新しい移行を作成しました。コマンドを実行しようとすると

php artisan migrate

それが示す:

[Illuminate\Database\QueryException]
SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'users' alre
ady exists (SQL: create table `users` (`id` int unsigned not null auto_incr
ement primary key, `username` varchar(255) not null, `email` varchar(255) n
ot null, `password` varchar(255) not null, `created_at` timestamp default 0
 not null, `updated_at` timestamp default 0 not null) default character set
 utf8 collate utf8_unicode_ci)

ここに私の新しい移行テーブルがあります:

<?php

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

class CreateBooksTable extends Migration {
    public function up()
    {
        Schema::create('books', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('name');
            $table->string('auther');
            $table->string('area');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::drop('books');
    }
}

エラーを取り除くにはどうすればよいですか?

50

実行する必要があります

php artisan migrate:rollback

それも失敗した場合は、移行テーブルが混乱しているように見えるか、前のロールバックを実行したときにユーザーテーブルがテーブルをドロップしなかったため、必要なすべてのテーブルをドロップします。

編集:

これが発生する理由は、以前にロールバックを実行し、コードにエラーがあったか、テーブルを削除しなかったためです。ただし、これはまだlaravel移行テーブルを台無しにしており、それに関する限り、ユーザーテーブルをプッシュする記録はありません。ただし、ユーザーテーブルは既に存在しているため、このエラーがスローされます。

42
mschuett

V5.xでは、まだ問題に直面する可能性があります。したがって、最初に手動で関連テーブルを削除してみてください

php artisan tinker

それから

Schema::drop('books')

(そしてqで終了します)

これで、php artisan migrate:rollbackphp artisan migrateを正常に作成できます。

これが繰り返し発生する場合は、移行中のdown()メソッドが正しいテーブル名を表示していることを確認する必要があります。 (テーブル名を変更した場合は、落とし穴になります。)

52
amrography

私も同じ問題を抱えていました。理由は、移行フォルダー内のファイル名が、データベース内の移行の名前と一致しないためです(移行表を参照)。それらは同じでなければなりません。

26
Abaza

また、次のコードSchema::create('books', function(Blueprint $table)の前にSchema::drop('books');を挿入できます。

9
Trikly

php artisan migrate:freshを使用して、すべてのテーブルを削除してから移行できます。それが役に立てば幸い

8
user8810865

編集:(laravelの場合)

Laravelでプロジェクトに取り組んでいる間、この問題に出くわしました。テーブルがめちゃくちゃになり、列を頻繁に変更する必要がありました。テーブルができたら、php artisan migrateを実行できなくなりました。

私は問題を取り除くために次のことをしました-

  1. データベース内のテーブルを削除します[移行テーブルを含むすべてのテーブル]
  2. $ composer dump-autoload -o
  3. php artisan migrate

ルーメンに関する以前のコメント

[まあ、パーティーにかなり遅れました(そしておそらく私が探していたものとは異なるパーティー)。私は頭を叩き、大声で叫び、灰色の頭蓋骨の恵みにより解決策を見つけた。]

Lumenを使用して安らかなアプリを開発していますが、初めてです。これはlaravalとLumenを使用した私の最初のプロジェクト/実験です。私の依存関係

"require": {
    "php": ">=5.6.4",
    "laravel/Lumen-framework": "5.4.*",
    "vlucas/phpdotenv": "~2.2",
    "barryvdh/laravel-cors": "^0.8.6",
    "league/fractal": "^0.13.0"
},
"require-dev": {
    "fzaninotto/faker": "~1.4",
    "phpunit/phpunit": "~5.0",
    "mockery/mockery": "~0.9.4"
}

とにかく、昨日の夜まですべてが順調でしたが、突然phpunitがすでに存在するテーブルについて不平を言い始めました。

Caused by
PDOException: SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'items' already exists

ああ! Itemsテーブルがデータベースに存在する必要があります。そうでなければ、どのようにアイテムを保存するのでしょうか。

とにかく、問題はテストクラスでのみ持続しましたが、奇妙なことにブラウザーでは持続しませんでした(ヘッダーを変更するchrome、firefox、およびpostmanで確認しました)。期待どおりにデータを含むJSON応答を取得していました。

データベースを削除し、多くのmigraterefreshrollbackを使用して再作成しました。すべてがうまくいきましたが、phpunitにありました。

必死になって、移行ファイルを削除し(もちろんバックアップを最初に取得しました)、ターミナルでphpunitをヒットしました。再び同じこと。

突然、テスト目的でのみphpunit.xmlファイルに別のデータベース名を付けたことを思い出しました。私はそのデータベースをチェックし、何を推測しました! itemsという名前のテーブルがありました。このテーブルを手動で削除し、phpunitを実行すると、すべて正常に動作し始めました。

将来の参考のためにのみ私の経験を文書化しており、これが将来誰かに役立つことを願っています。

7
maksbd19

移行を使用していない人からいくつかの本当の悪いコードを継承しました!?

そのため、ファイル名と移行の一致にもかかわらず、「テーブルが存在する」エラーが発生しました。

2018_05_07_142737_create_users_table.php-間違った2018_05_07_142737_create_users_table-修正

6
Nik K

外部キーの制約をいじってから、同様の問題が発生しました。私のテーブル(注)の1つがなくなって、MySQLにドロップした後でも(タスク)が戻ってきて、実行できませんでした:php artisan migrate/refresh/reset。これにより、上記の42s01例外が発生しました。

私がそれを解決するために行ったのは、sagをvagrantに入れてからMySQL(vagrant ssh, mysql -u Homestead -p secret)に入れてから、DROP DATABASE Homestead; Then CREATE DATABASE Homestead; Then exit mysql and run:php artisan migrate`です。

明らかに、このソリューションはvagrant/Homesteadを使用していない人には機能しません。これが適切なワークフローであると主張することはありませんが、上記の問題によく似た問題を解決しました。

すべてのテーブルを削除できますが、良い方法ではありません。代わりにこのコマンドを試してください

php artisan migrate:fresh

命名規則を正しく使用してください。バージョンlaravel 5.7でこれをテストしました。サイトがすべての情報をドロップするため、サイトがサーバー上にあるときにこのコマンドを試さないことが重要です。

4
Murad

データベース内のすべての表をドロップしてから、

do this

php artisan migrate:refresh

移行ファイルを編集します

php artisan migrate:rollback

php artisan migrate再び^ _ ^

できあがりました!!

3
Fikri Zufri

私の答えはもっと役立つと思います。私もこのエラーに直面しました。次に、特定の移行ファイルを削除し、php artisanで再作成しようとしました。

しかし、1、2日前に移行に関するララキャストビデオを見ているときにこのポイントを得る前に、特定のテーブルをロールバックして移行することを考えていました。何らかの理由で特定の移行ファイルを削除して再作成を試みましたが、そうすることで次のことができました。

[ErrorException] include(C:\ wamp64\www\laraveldeneme\vendor\composer /../../ database/migrations/2017_01_09_082715_create_articles_table.php):ストリームのオープンに失敗しました:そのようなファイルまたはディレクトリはありません

そのファイルをチェックすると、autoload_classmap.phpファイルの配列の先頭に次の行があります。

'CreateArticlesTable' => $ baseDir。 '/ database/migrations/2017_01_09_083946_create_articles_table.php'、

移行ファイルを完全にロールバックまたは削除すると、移行ファイルに関連するレコードはcomposer autoload_classmap.phpファイルに残ります。

この問題を解決するために、覚えていない場所から以下のcomposerコマンドを見つけました。

composer dump-autoload

このコードを実行すると、削除した移行ファイルに関連する行がなくなります。それから私は走った:

php artisan make:migration create_articles_table --create=articles

最後に、同じ名前で移行ファイルを再作成しました

3
Aydın Bulut

phpmyadminに移動し、laravel用に作成したデータベースをドロップしてから再度作成し、cmd(Windowsを使用している場合)ルートプロジェクトに移動し、php artisan migrateと入力します。

2
Silvanas

テーブルのロールバックを確認した後、必ず削除してください。

問題がある場合は、phpmyadminなどのデータベースアプリケーションから手動でテーブルを削除します(私はmac用sequel proを使用しています)。

移行のダウン方法を修正します。

注:ロールバックしてから移行してください。エラーが発生した場所を確認するためにmigrate:refreshを使用しないでください。

その後、テスト用の新しいデータベースでテストできます。問題がどこにあるかを検出します。

また、これを読んでみてください question

2
Hos Mercury
php artisan migrate:rollback 

解決策を確認してください: Laravel Official Solution

Migrations guide に概説されているように、これを修正するには、app\Providers\AppServiceProvider.phpファイルを編集し、ブートメソッド内でデフォルトの文字列長を設定するだけです。

use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}

上記のコマンドの後、残りのすべてのテーブルを手動で削除してからコマンドを実行する必要があります。

php artisan migrate:fresh
2
flik

最初にデータベースにユーザーテーブルをドロップし、コマンドプロンプトに移動して入力します

php artisan migrate

この答えは役立つと思います。

1
srilaxmi

これをAppServiceProvider.phpに追加します

use Illuminate\Support\Facades\Schema;
public function boot() {
    Schema::defaultStringLength(191);
}
1
ntsasng
  1. Phpmyadminですべてのテーブルを手動で削除します。

  2. Database/migrationsの各移行ファイルに移動します。これらの2つのコードを見つけて削除します。

    a)-> index()(2014_10_12_100000_create_password_resets_table.phpの17行目にあります)

    b)-> unique()(2014_10_12_000000_create_users_table.phpの19行目にあります)

  3. 「php artisan migrate」を実行します。

  4. できた.

これは、最新のlaravelクラス(2018年2月12日)が-> index()および-> unique()の関数を削除したために起こると思います。

1
Master Jowin

Sequel-proの「ユーザー」テーブルを削除して問題を解決し(ユーザーテーブルにデータがありません)、php artisan migrateを実行できます

ここにスクリーンショットの前後があります

ユーザーテーブルユーザーを削除する前に

enter image description here

テーブルユーザーを削除した後 enter image description here

1
windtalker
  1. すべてのテーブルデータベースを削除する
  2. Database/migrations /フォルダーの2つのファイルを更新します:2014_10_12_000000_create_users_table.php、2014_10_12_100000_create_password_resets_table.php

2014_10_12_100000_create_password_resets_table.php

Schema::create('password_resets', function (Blueprint $table) {
     $table->string('email');
     $table->string('token');
     $table->timestamp('created_at')->nullable();
});

2014_10_12_000000_create_users_table.php

Schema::create('users', function (Blueprint $table) {
     $table->increments('id');
     $table->string('name');
     $table->string('email');
     $table->string('password');
     $table->rememberToken();
     $table->timestamps();
});
1
Jacksonit.org

私も同じ問題に直面していました。同じプロセスに従いましたが、問題が解決しなかったため、別のことを試してみました。データベースからテーブルを削除し、ヘッダーファイルを使用しました

use Illuminate\Support\Facades\Schema;

これを追加するには、起動方法のデフォルトの文字列の長さを増やします:

Schema::defaultStringLength(191);

その後、再度移行します。問題は解決され、すべてのテーブルがデータベースに作成されます。

0
Gaurav Jain

laravel 5.4で、この問題が発生している場合。 このリンクを確認してください

-または-

App/Providers/AppServiceProvider.phpのこのページに移動し、下にコードを追加します

use Illuminate\Support\Facades\Schema;

public function boot()
{
Schema::defaultStringLength(191);
}
0

私は同じ問題を抱えていました。問題はデータベース内のテーブル移行に保存された名前にあります。なぜなら、私のデータベースには2017_10_18_200000_nameとファイル2016_10_18_200000_nameが存在するため、動作するファイルの名前を変更した後です。

0
I.Yan

DANGER-これらの回答のほとんどはデータベースを消去するため、実稼働での使用は推奨されません。

この問題には多くの「解決策」があることは明らかですが、私が通読したこれらの解決策はすべて非常に破壊的な解決策であり、本番データベースには機能しません。解決策の数に基づいて、このエラーにはいくつかの原因が考えられます。

私のエラーは、移行テーブルにエントリがないために発生していました。正確にどのように発生したのかわかりませんが、再度追加してもエラーは表示されません。

0
Jase

編集AppServiceProvider.phpはapp/Providers/AppServiceProvider.phpにあり、追加します

use Illuminate\Support\Facades\Schema;

public function boot()
{
Schema::defaultStringLength(191);
}

次に実行する

composer update

端末で。それは私を助けてくれました、あなたにとってもうまくいくかもしれません。

0
S.M Talha

すべてのデータベーステーブルを削除し、CMDを使用してプロジェクトパスでこの行を実行します

php artisan migrate
0

私もこの問題を抱えていましたが、この答えは Youtube Video で見つかりました。理想かどうかはわかりませんが、私が見た中で最高です。

スキーマに長さを指定することにより、プロバイダーディレクトリのAppServiceProvider.phpファイルのようです。この場合、191。魔法のように動作します。 スクリーンショット 。その後、彼は実行しました:php artisan migrate:fresh。これがうまくいくことを願っています。

0
Smitho

まず、DBのmigrationsテーブルを確認し、プロジェクトのデータベースフォルダーの移行ファイルがこのテーブルデータと等しいことを確認します。手動で移行ファイルを作成する場合、composerでmigrateコマンドを実行するとこのエラーが表示されることがあります。

0
Masoud Rezaei

テーブルを作成する前に、いつでもテーブルの存在を確認できます。

    if(!Schema::hasTable('books')){
 Schema::create('books', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('name');
            $table->string('auther');
            $table->string('area');
            $table->timestamps();
        });
}
0

データベースの作成には文字通り数秒かかります。機密データがある場合は、現在のデータベースをエクスポートします。移行を確認し、その中のすべての間違った方法を排除します。データベースを削除します。データベースを再作成します。 php artisan migrateその後、以前にデータベースにあったデータを返すことができます。 ワークス!!!

0
Shisha

解決策:Laravel移行テーブルは既に存在しています... Laravel 5.8も動作します

app\Providers\AppServiceProvider.phpファイル

そして、ブートメソッド内でデフォルトの文字列の長さを設定します:

public function boot()
{
    Schema::defaultStringLength(191);
}

and open

config\database.php

'charset' =>'utf8mb4',
'collation' =>'utf8mb4_unicode_ci',

に変更し、

'charset' =>'utf8',
'collation' =>'utf8_unicode_ci',

すべてのファイルを保存し、コマンドプロンプトに移動します

php artisan migrate
0
Zaheer Sadique