执行php artisan migrate时Laravel迁移失败:users表已存在
Laravel迁移报错:Table 'users' already exists 解决方法
错误信息
执行php artisan migrate时终端输出:
INFO Running migrations. 2014_10_12_000000_create_users_table .................................................................................................... 3ms FAIL Illuminate\Database\QueryException SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'users' already exists (SQL: create table `users` (`id` bigint unsigned not null auto_increment primary key, `name` varchar(191) not null, `email` varchar(191) not null, `email_verified_at` timestamp null, `password` varchar(191) not null, `utype` varchar(191) not null default 'USR' comment 'ADM - 管理员专用,USR - 普通用户专用', `remember_token` varchar(100) null, `created_at` timestamp null, `updated_at` timestamp null) default character set utf8mb4 collate 'utf8mb4_unicode_ci') at C:\wamp64\www\laravel9ecommerce\vendor\laravel\framework\src\Illuminate\Database\Connection.php:759 755▕ // If an exception occurs when attempting to run a query, we'll format the error 756▕ // message to include the bindings with SQL, which will make this exception a 757▕ // lot more helpful to the developer instead of just the database's errors. 758▕ catch (Exception $e) { ➜ 759▕ throw new QueryException( 760▕ $query, $this->prepareBindings($bindings), $e 761▕ ); 762▕ } 763▕ }
对应的迁移代码(已翻译注释):
/** * 执行迁移 * * @return void */ public function up() { Schema::create('users', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); $table->string('utype')->default('USR')->comment('ADM - 管理员专用,USR - 普通用户专用'); $table->rememberToken(); $table->timestamps(); }); }
问题原因
数据库中已存在users表,但Laravel的migrations表中没有记录该迁移已执行,导致框架尝试重复创建表引发冲突。
解决方案
方案1:删除现有表并重新迁移(适合无重要数据的情况)
- 进入数据库管理工具(如phpMyAdmin、Navicat),执行以下操作:
- 删除
users表 - 删除
migrations表中migration字段值为2014_10_12_000000_create_users_table的记录
- 删除
- 重新运行迁移命令:
php artisan migrate
方案2:修改迁移文件跳过已存在的表(适合保留现有数据的情况)
修改迁移文件的up方法,先检查表是否存在,不存在再创建:
public function up() { if (!Schema::hasTable('users')) { Schema::create('users', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); $table->string('utype')->default('USR')->comment('ADM - 管理员专用,USR - 普通用户专用'); $table->rememberToken(); $table->timestamps(); }); } }
修改后再次执行php artisan migrate即可。
方案3:标记迁移为已执行(不修改表结构,仅更新迁移记录)
如果表结构已经符合需求,只需让Laravel认为该迁移已完成:
- Laravel 8及以上版本可直接运行命令:
php artisan migrate:mark-executed 2014_10_12_000000_create_users_table - 低版本可手动执行SQL插入迁移记录:
若INSERT INTO migrations (migration, batch) VALUES ('2014_10_12_000000_create_users_table', (SELECT MAX(batch) FROM migrations) + 1);migrations表为空,batch值填1即可。
内容的提问来源于stack exchange,提问作者ilgar
相关产品推荐
相关产品推荐

