执行php artisan migrate报products表已存在错误如何解决
执行php artisan migrate命令时触发数据库报错,已知前置操作是手动删除了migrations表中products表对应的迁移记录,但数据库内products表实体未被删除,导致迁移执行时重复触发建表逻辑。
具体报错信息如下:
SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'products' already exists (SQL: create table
products(idbigint unsigned not null auto_increment primary key,category_idint not null,subcategory_idint not null,product_name...) default character set utf8mb4 collate 'utf8mb4_unicode_ci')
触发位置:F:\xampp\htdocs\suzayetstore\vendor\laravel\framework\src\Illuminate\Database\Connection.php:742PDOException: SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'products' already exists
抛出位置:F:\xampp\htdocs\suzayetstore\vendor\laravel\framework\src\Illuminate\Database\Connection.php:527
根据是否需要保留现有products表内的数据,选择对应方案操作即可:
- 方案1:保留现有表数据,补录迁移记录
这是最稳妥的方案,不会改动现有表结构和数据:- 打开数据库的
migrations表,查看现有记录的batch字段最大值 - 插入一条新记录:
migration字段值填项目中database/migrations目录下products对应迁移文件的文件名(去掉.php后缀,例如2023_10_12_082315_create_products_table),batch字段值填刚才查到的最大batch值+1 - 重新执行
php artisan migrate,迁移程序识别到该迁移已有完成记录,就不会重复执行建表逻辑。
- 打开数据库的
- 方案2:不需要保留现有products表数据
直接手动删除数据库中已存在的products表,再重新执行php artisan migrate即可正常完成建表流程。 - 方案3:修改迁移文件增加存在判断(适合本地开发未上线项目)
打开products对应的迁移文件,给建表逻辑增加表存在校验,修改后的up()方法示例:
保存后重新执行public function up() { // 检测表不存在时才执行建表 if (!Schema::hasTable('products')) { Schema::create('products', function (Blueprint $table) { $table->id(); $table->integer('category_id'); $table->integer('subcategory_id'); $table->string('product_name'); // 其余原有字段定义保持不变 $table->timestamps(); }); } }php artisan migrate,程序检测到表已存在会跳过建表步骤,同时自动写入迁移记录,后续执行迁移不会再触发该报错。
内容的提问来源于stack exchange,提问作者Md Suzayet Hossan

