以前にユーザーテーブルを作成しました。これで、スキーマ内に新しいブックテーブルを作成するための新しい移行を作成しました。コマンドを実行しようとすると
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');
}
}
エラーを取り除くにはどうすればよいですか?
実行する必要があります
php artisan migrate:rollback
それも失敗した場合は、移行テーブルが混乱しているように見えるか、前のロールバックを実行したときにユーザーテーブルがテーブルをドロップしなかったため、必要なすべてのテーブルをドロップします。
編集:
これが発生する理由は、以前にロールバックを実行し、コードにエラーがあったか、テーブルを削除しなかったためです。ただし、これはまだlaravel移行テーブルを台無しにしており、それに関する限り、ユーザーテーブルをプッシュする記録はありません。ただし、ユーザーテーブルは既に存在しているため、このエラーがスローされます。
V5.xでは、まだ問題に直面する可能性があります。したがって、最初に手動で関連テーブルを削除してみてください
php artisan tinker
それから
Schema::drop('books')
(そしてq
で終了します)
これで、php artisan migrate:rollback
とphp artisan migrate
を正常に作成できます。
これが繰り返し発生する場合は、移行中のdown()
メソッドが正しいテーブル名を表示していることを確認する必要があります。 (テーブル名を変更した場合は、落とし穴になります。)
私も同じ問題を抱えていました。理由は、移行フォルダー内のファイル名が、データベース内の移行の名前と一致しないためです(移行表を参照)。それらは同じでなければなりません。
また、次のコードSchema::create('books', function(Blueprint $table)
の前にSchema::drop('books');
を挿入できます。
php artisan migrate:fresh
を使用して、すべてのテーブルを削除してから移行できます。それが役に立てば幸い
編集:(laravelの場合)
Laravelでプロジェクトに取り組んでいる間、この問題に出くわしました。テーブルがめちゃくちゃになり、列を頻繁に変更する必要がありました。テーブルができたら、php artisan migrate
を実行できなくなりました。
私は問題を取り除くために次のことをしました-
$ composer dump-autoload -o
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応答を取得していました。
データベースを削除し、多くのmigrate
、refresh
、rollback
を使用して再作成しました。すべてがうまくいきましたが、phpunit
にありました。
必死になって、移行ファイルを削除し(もちろんバックアップを最初に取得しました)、ターミナルでphpunit
をヒットしました。再び同じこと。
突然、テスト目的でのみphpunit.xml
ファイルに別のデータベース名を付けたことを思い出しました。私はそのデータベースをチェックし、何を推測しました! items
という名前のテーブルがありました。このテーブルを手動で削除し、phpunit
を実行すると、すべて正常に動作し始めました。
将来の参考のためにのみ私の経験を文書化しており、これが将来誰かに役立つことを願っています。
移行を使用していない人からいくつかの本当の悪いコードを継承しました!?
そのため、ファイル名と移行の一致にもかかわらず、「テーブルが存在する」エラーが発生しました。
2018_05_07_142737_create_users_table.php-間違った2018_05_07_142737_create_users_table-修正
外部キーの制約をいじってから、同様の問題が発生しました。私のテーブル(注)の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でこれをテストしました。サイトがすべての情報をドロップするため、サイトがサーバー上にあるときにこのコマンドを試さないことが重要です。
私の答えはもっと役立つと思います。私もこのエラーに直面しました。次に、特定の移行ファイルを削除し、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
最後に、同じ名前で移行ファイルを再作成しました
phpmyadminに移動し、laravel用に作成したデータベースをドロップしてから再度作成し、cmd(Windowsを使用している場合)ルートプロジェクトに移動し、php artisan migrateと入力します。
テーブルのロールバックを確認した後、必ず削除してください。
問題がある場合は、phpmyadminなどのデータベースアプリケーションから手動でテーブルを削除します(私はmac用sequel proを使用しています)。
移行のダウン方法を修正します。
注:ロールバックしてから移行してください。エラーが発生した場所を確認するためにmigrate:refreshを使用しないでください。
その後、テスト用の新しいデータベースでテストできます。問題がどこにあるかを検出します。
また、これを読んでみてください question
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
最初にデータベースにユーザーテーブルをドロップし、コマンドプロンプトに移動して入力します
php artisan migrate
この答えは役立つと思います。
これをAppServiceProvider.phpに追加します
use Illuminate\Support\Facades\Schema;
public function boot() {
Schema::defaultStringLength(191);
}
Phpmyadminですべてのテーブルを手動で削除します。
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行目にあります)
「php artisan migrate」を実行します。
できた.
これは、最新のlaravelクラス(2018年2月12日)が-> index()および-> unique()の関数を削除したために起こると思います。
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();
});
私も同じ問題に直面していました。同じプロセスに従いましたが、問題が解決しなかったため、別のことを試してみました。データベースからテーブルを削除し、ヘッダーファイルを使用しました
use Illuminate\Support\Facades\Schema;
これを追加するには、起動方法のデフォルトの文字列の長さを増やします:
Schema::defaultStringLength(191);
その後、再度移行します。問題は解決され、すべてのテーブルがデータベースに作成されます。
laravel 5.4で、この問題が発生している場合。 このリンクを確認してください
-または-
App/Providers/AppServiceProvider.phpのこのページに移動し、下にコードを追加します
use Illuminate\Support\Facades\Schema;
public function boot()
{
Schema::defaultStringLength(191);
}
私は同じ問題を抱えていました。問題はデータベース内のテーブル移行に保存された名前にあります。なぜなら、私のデータベースには2017_10_18_200000_name
とファイル2016_10_18_200000_name
が存在するため、動作するファイルの名前を変更した後です。
DANGER-これらの回答のほとんどはデータベースを消去するため、実稼働での使用は推奨されません。
この問題には多くの「解決策」があることは明らかですが、私が通読したこれらの解決策はすべて非常に破壊的な解決策であり、本番データベースには機能しません。解決策の数に基づいて、このエラーにはいくつかの原因が考えられます。
私のエラーは、移行テーブルにエントリがないために発生していました。正確にどのように発生したのかわかりませんが、再度追加してもエラーは表示されません。
編集AppServiceProvider.phpはapp/Providers/AppServiceProvider.phpにあり、追加します
use Illuminate\Support\Facades\Schema;
public function boot()
{
Schema::defaultStringLength(191);
}
次に実行する
composer update
端末で。それは私を助けてくれました、あなたにとってもうまくいくかもしれません。
すべてのデータベーステーブルを削除し、CMDを使用してプロジェクトパスでこの行を実行します
php artisan migrate
私もこの問題を抱えていましたが、この答えは Youtube Video で見つかりました。理想かどうかはわかりませんが、私が見た中で最高です。
スキーマに長さを指定することにより、プロバイダーディレクトリのAppServiceProvider.php
ファイルのようです。この場合、191
。魔法のように動作します。 スクリーンショット 。その後、彼は実行しました:php artisan migrate:fresh
。これがうまくいくことを願っています。
まず、DBのmigrationsテーブルを確認し、プロジェクトのデータベースフォルダーの移行ファイルがこのテーブルデータと等しいことを確認します。手動で移行ファイルを作成する場合、composerでmigrateコマンドを実行するとこのエラーが表示されることがあります。
テーブルを作成する前に、いつでもテーブルの存在を確認できます。
if(!Schema::hasTable('books')){
Schema::create('books', function(Blueprint $table)
{
$table->increments('id');
$table->string('name');
$table->string('auther');
$table->string('area');
$table->timestamps();
});
}
データベースの作成には文字通り数秒かかります。機密データがある場合は、現在のデータベースをエクスポートします。移行を確認し、その中のすべての間違った方法を排除します。データベースを削除します。データベースを再作成します。 php artisan migrateその後、以前にデータベースにあったデータを返すことができます。 ワークス!!!
解決策: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