【Laravel】db:wipe・migrate:fresh・migrate:resetの違いと使い分け

2026-04-05

最終更新: 2026年4月 | Laravel 12対応

Laravelでデータベースをリセットしたいとき、db:wipemigrate:freshmigrate:reset の3つが候補に挙がります。

「とりあえず migrate:fresh を使っているけど、他との違いがよくわからない」

「db:wipe って何のためにあるの?」

「どのコマンドを使えばいい?」

30年の実務経験をもとに、3つのコマンドの違いと正しい使い分けを具体的に解説します。

1. 3つのコマンドの違い

コマンドテーブル削除マイグレーション再実行migrationsテーブル
db:wipe✅ 全削除❌ しない✅ 一緒に削除される
migrate:fresh✅ 全削除✅ する✅ 再作成される
migrate:reset❌ しない⬇️ ロールバックのみ✅ 更新される

一言でまとめると:

  • db:wipe → ただ消すだけ。その後どうするかは自分で決める
  • migrate:fresh → 消してマイグレーションを最初からやり直す
  • migrate:reset → ロールバックして元の状態に戻す

2. 各コマンドの詳細

db:wipe

php artisan db:wipe

実行結果:

INFO  Dropped all tables successfully.

全テーブル・ビュー・タイプを削除します。マイグレーションは再実行しません。

オプション一覧:

オプション説明
--database=使用するDB接続を指定
--drop-viewsビューも一緒に削除
--drop-typesタイプも削除(PostgreSQLのみ)
--force本番環境での強制実行

migrate:fresh

php artisan migrate:fresh

実行結果:

Dropped all tables successfully.
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (12.34ms)
...

全テーブルを削除してから、全マイグレーションを最初から実行します。--seed オプションと組み合わせて使うことが多いです。

php artisan migrate:fresh --seed

migrate:reset

php artisan migrate:reset

実行結果:

Rolling back: 2023_02_20_add_status_to_posts_table
Rolled back:  2023_02_20_add_status_to_posts_table (8.12ms)
Rolling back: 2023_01_15_create_posts_table
Rolled back:  2023_01_15_create_posts_table (5.43ms)
...

全マイグレーションをロールバックします。テーブルは削除されますが、migrate:fresh と違い down() メソッドを通じて段階的に処理されます。

3. 使い分けの基準

実務で30年使ってきた判断基準を整理するとこうなります。

開発中にDB全体をリセットしたい

migrate:fresh --seed が正解。これ一択です。

マイグレーションファイルを整理・削除したあとにDBもリセットしたい

db:wipe が使える唯一のシーン。migrate:fresh だと削除したファイルの down() が動かず失敗することがあるため。

ロールバックの動作確認をしたい

migrate:resetdown() メソッドが正しく書けているか確認できます。

テスト環境で毎回クリーンな状態にしたい

RefreshDatabase トレイトを使うのが正解。コマンドを手動で叩く必要はありません。

4. 注意点

本番環境では使わない

3つとも本番環境での実行は原則禁止です。--force オプションをつければ実行できますが、全データが失われます。

# 絶対にやってはいけない(本番環境で)
php artisan db:wipe --force
php artisan migrate:fresh --force

migrate:fresh は down() を使わない

migrate:fresh はテーブルを直接 DROP するため、down() メソッドは実行されません。migrate:reset と混同しないように注意してください。

# migrate:fresh  → DROP TABLE を直接実行(down()は使わない)
# migrate:reset  → down()メソッドを通じてロールバック

5. よく使うコマンドパターン

# 開発中の基本リセット(これが一番よく使う)
php artisan migrate:fresh --seed

# マイグレーション状態確認してからリセット
php artisan migrate:status
php artisan migrate:fresh --seed

# ロールバックの動作確認
php artisan migrate:reset
php artisan migrate

# マイグレーションファイル整理後のリセット
php artisan db:wipe
php artisan migrate --seed

まとめ

やりたいこと使うコマンド
開発中にDBを全リセットしたいmigrate:fresh --seed
マイグレーションファイルを整理後にリセットdb:wipemigrate
down() の動作確認をしたいmigrate:reset
テストで毎回クリーンにしたいRefreshDatabase トレイト

迷ったら migrate:fresh --seed を使っておけば、開発中はほぼ困りません。db:wipe は「マイグレーションファイルの状態に関係なく、とにかく全消去したい」という限られたケースで使うコマンドです。

Source

LaravelLaravel,MySQL

Posted by 千原 耕司