Rollback one specific migration in Laravel

LaravelLaravel 4Laravel 5Database Migration

Laravel Problem Overview


I want

to rollback only :

Rolled back: 2015_05_15_195423_alter_table_web_directories


I run

php artisan migrate:rollback, 3 of my migration are rolling back.

Rolled back: 2015_05_15_195423_alter_table_web_directories
Rolled back: 2015_05_13_135240_create_web_directories_table
Rolled back: 2015_05_13_134411_create_contacts_table

I delete

both of my web_directories and my contacts table unintentionally. I never want that to happen, and if I can rollback only that specific one, this disaster will never happen.

Laravel Solutions


Solution 1 - Laravel

Laravel 5.3+

Rollback one step. Natively.

php artisan migrate:rollback --step=1

And here's the manual page: docs.


Laravel 5.2 and before

No way to do without some hassle. For details, check Martin Bean's answer.

Solution 2 - Laravel

If you look in your migrations table, then you’ll see each migration has a batch number. So when you roll back, it rolls back each migration that was part of the last batch.

If you only want to roll back the very last migration, then just increment the batch number by one. Then next time you run the rollback command, it’ll only roll back that one migration as it’s in a “batch” of its own.

Alternatively, from Laravel 5.3 onwards, you can just run:

php artisan migrate:rollback --step=1

That will rollback the last migration, no matter what its batch number is.

Solution 3 - Laravel

Best way is to create a new migration and make required changes in that.

Worst case workaround (if you have access to DB plus you are okay with a RESET of that table's data):

  1. Go to DB and delete/rename the migration entry for your-specific-migration
  2. Drop the table created by your-specific-migration
  3. Run php artisan migrate --path=/database/migrations/your-specific-migration.php

This will force laravel to run that specific migration as no entry about it exists in Laravel's migration history

UPDATE: The Laravel way (Thanks, @thiago-valente)

Run:

php artisan migrate:rollback --path=/database/migrations/your-specific-migration.php

and then:

php artisan migrate

This will re-run that particular migration

Solution 4 - Laravel

Every time you rollback you get the last batch of migration. use the command

php artisan migrate:rollback --step=1

Solution 5 - Laravel

better to used refresh migrate

> You may rollback & re-migrate a limited number of migrations by > providing the step option to the refresh command. For example, the > following command will rollback & re-migrate the last two migrations:

php artisan migrate:refresh --step=2

otherwise used rollback migrate

> You may rollback a limited number of migrations by providing the step > option to the rollback command. For example, the following command > will rollback the last three migrations:

php artisan migrate:rollback --step=3

for more detail about migration see

Solution 6 - Laravel

If you can't do what is told by @Martin Bean, then you can try another trick.

Create a new migration and on that file in up() method insert what's in down() method of the migration you want to rollback and in down() method insert what's in up() method.

e.g if your original migration is like this

public function up()
{
	Schema::create('users', function(Blueprint $table)
	{
		$table->increments('id')->unsigned();
		$table->string('name');
	});
}
public function down()
{
	Schema::drop('users');
}

then in new migration file do this

public function up()
{
	Schema::drop('users');
}
public function down()
{
	Schema::create('users', function(Blueprint $table)
	{
		$table->increments('id')->unsigned();
		$table->string('name');
	});
}

and then run the migrate, it will delete the table. and if you again want that back just rollback it.

Solution 7 - Laravel

It might be a little late to answer this question but here's a very good, clean and efficient way to do it I feel. I'll try to be as thorough as possible.

Before creating your migrations create different directories like so:

    database
       | 
       migrations
            |
            batch_1
            batch_2
            batch_3

Then, when creating your migrations run the following command (using your tables as an example):

     php artisan make:migration alter_table_web_directories --path=database/migrations/batch_1
     

or

     php artisan make:migration alter_table_web_directories --path=database/migrations/batch_2

or

     php artisan make:migration alter_table_web_directories --path=database/migrations/batch_3

The commands above will make the migration file within the given directory path. Then you can simply run the following command to migrate your files via their assigned directories.

    php artisan migrate alter_table_web_directories --path=database/migrations/batch_1

*Note: You can change batch_1 to batch_2 or batch_3 or whatever folder name you're storing the migration files in. As long as it remains within the database/migrations directory or some specified directory.

Next if you need to rollback your specific migrations you can rollback by batch as shown below:

    php artisan migrate:rollback --step=1
                    or try
php artisan migrate:rollback alter_table_web_directories --path=database/migrations/batch_1

or

    php artisan migrate:rollback --step=2
                    or try
php artisan migrate:rollback alter_table_web_directories --path=database/migrations/batch_2

or

    php artisan migrate:rollback --step=3
                    or try
php artisan migrate:rollback alter_table_web_directories --path=database/migrations/batch_3

Using these techniques will allow you more flexibility and control over your database(s) and any modifications made to your schema.

Solution 8 - Laravel

If you have access to the DB you have a easier solution. You can delete the record from migrations table and then just drop the table. with SQL client.

Or can use

php artisan migrate:rollback --path=... 

Like many answers. And remember the path is Location. You can remove even module migration like this. (Any migration from anywhare)

php artisan migrate:rollback --path=Modules/YourModule/database/migrations/2020_05_15_xxxxxx_create_your_table.php

And remember, If you are using linux servers careful about case sensitivity. You have to add like /Database/Migrations with starting capital.

/Database/Migrations/2020_05_15_xxxxxx_create_your_table.php

Solution 9 - Laravel

Try this:

php artisan migrate:rollback --step=1

This works from Laravel 5.3 +

Solution 10 - Laravel

Rollback one step. Natively.

php artisan migrate:rollback --step=1

Rollback two step. Natively.

php artisan migrate:rollback --step=2

Solution 11 - Laravel

You can use

php artisan migrate:rollback --path=/database/migrations/timestamp_filename.php

This will remove that specific migration. If the file has foreign key dependency i hoped you use the drop methods. For those cases try creating a new migration and drop foreign if needed.

Solution 12 - Laravel

If you want to rollback last migration.

php artisan migrate:rollback

If you want to rollback specific migration then go to migration table and set highest value of that record in batch. Then.

php artisan migrate:rollback

Currently i'm working on laravel 5.8 if not working any other version of laravel please inform to me.

Solution 13 - Laravel

Migrate tables one by one.

Change the batch number of the migration you want to rollback to the highest.

Run migrate:rollback.

May not be the most comfortable way to deal with larger projects.

Solution 14 - Laravel

Use command "php artisan migrate:rollback --step=1" to rollback migration to 1 step back.

For more info check the link :- https://laravel.com/docs/master/migrations#running-migrations

Solution 15 - Laravel

If you want modify original migration file and migrate it again, you can use this package to migrate. (Applicable to Laravel 5.4 or later)

First, install package in your Laravel project:

composer require caloskao/migrate-specific

Register command at app/Console/Kernel.php :

protected $commands = [
    \CalosKao\MigrateSpecific::class
];

Now, run this command to migrate your file

php artisan migrate:specific database/migrations/table.php

Solution 16 - Laravel

1.) Inside the database, head to the migrations table and delete the entry of the migration related to the table you want to drop.

Migration table image example

2.) Next, delete the table related to the migration you just deleted from instruction 1.

Delete table image example

3.) Finally, do the changes you want to the migration file of the table you deleted from instruction no. 2 then run php artisan migrate to migrate the table again.

Solution 17 - Laravel

INSERT INTO homestead.bb_migrations (`migration`, `batch`) 	VALUES ('2016_01_21_064436_create_victory_point_balance_table', '2')

something like this

Solution 18 - Laravel

As stated in the Laravel manual, you may roll back specific number of migrations using the --step option

php artisan migrate:rollback --step=5

Solution 19 - Laravel

php artisan migrate:rollback --path=/database/migrations/0000_00_00_0000_create_something_table.php

Solution 20 - Laravel

Another alternative to those mentioned if you need to do this a bunch of times with the same migration(s). Personally I think this adds a lot of flexibility to your migrations.

Add database/migrations to your autoload object in your composer.json like this:

"autoload": {
        "psr-4": {
            "App\\": "app/"
        },
        "classmap": [
            "database/seeds",
            "database/factories",
            "database/support",
            "database/migrations" // add this line
        ]
    },

Then add namespace Database\Migrations; to all of your migration files.

Then run $ composer dump-autoload to refresh your composer.lock file.

Then, assuming your class name for the migration is AlterTableWebDirectories, you can create a command like this:

$ php artisan make:command DropAlterTableWebDirectories

And write this logic in your handle() method:

public function handle {
   (new AlterTableWebDirectories)->down();
   DB::raw("delete from migrations where migration like '%alter_table_web_directories%'");
}

This will do exactly what you want. If you want to decrement the migration count instead of deleting it, you can probably figure out how to change the DB:raw command.

This command could be extended to allow you to dynamically choose which migration you're dropping it by passing an argument into the command.

Then when you're reading to migrate that file again, you can just run php artisan migrate and it will only migrate that one.

This process allows you to make specific changes to migrations without having to do a full refresh and seed each time.

Personally I need to do that a lot because my seeds are rather large.

Solution 21 - Laravel

It's quite easy to roll back just a specific migration.
Since the command php artisan migrate:rollback, undo the last database migration, and the order of the migrations execution is stored in the batch field in the migrations table.

You can edit the batch value of the migration that you want to rollback and set it as the higher. Then you can rollback that migration with a simple:

php artisan migrate:rollback

After editing the same migration you can execute it again with a simple

php artisan migrate

NOTICE: if two or more migrations have the same higher value, they will be all rolled back at the same time.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questioncode-8View Question on Stackoverflow
Solution 1 - LaravelYauheni PrakopchykView Answer on Stackoverflow
Solution 2 - LaravelMartin BeanView Answer on Stackoverflow
Solution 3 - LaravelDeepak ThomasView Answer on Stackoverflow
Solution 4 - LaravelPAUL KIARIEView Answer on Stackoverflow
Solution 5 - LaravelJignesh JoisarView Answer on Stackoverflow
Solution 6 - LaravelNehal HasnayeenView Answer on Stackoverflow
Solution 7 - LaravelAndre F.View Answer on Stackoverflow
Solution 8 - LaravelvimuthView Answer on Stackoverflow
Solution 9 - LaravelYvan RugweView Answer on Stackoverflow
Solution 10 - LaravelParth kharechaView Answer on Stackoverflow
Solution 11 - Laravelatikur rahmanView Answer on Stackoverflow
Solution 12 - LaravelRaghu AryanView Answer on Stackoverflow
Solution 13 - LaravelJeffzView Answer on Stackoverflow
Solution 14 - LaravelShah-KodesView Answer on Stackoverflow
Solution 15 - LaravelCalosView Answer on Stackoverflow
Solution 16 - LaravelKidali KevinView Answer on Stackoverflow
Solution 17 - LaravelHarry BoshView Answer on Stackoverflow
Solution 18 - LaravelSlav LevinView Answer on Stackoverflow
Solution 19 - LaravelDacodView Answer on Stackoverflow
Solution 20 - LaravelWills ManleyView Answer on Stackoverflow
Solution 21 - LaravelDavide CasiraghiView Answer on Stackoverflow