我刚创建了一个新的迁移文件,用于向现有表中插入新列。
文件代码是:
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AddStatusToPhoto extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('photos', function(Blueprint $table)
{
$table->integer('status');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//
}
}
但是当我运行php artisan migrate时,会出现一条错误消息:
[Illuminate\Database\QueryException]
SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'permission_
role' already exists (SQL: create table `permission_role` (`id` int unsigne
d not null auto_increment primary key, `permission_id` int unsigned not nul
l, `role_id` int unsigned not null, `created_at` timestamp default 0 not nu
ll, `updated_at` timestamp default 0 not null) default character set utf8 c
ollate utf8_unicode_ci)
任何人都知道这是什么问题?
答案 0 :(得分:0)
您之前的迁移角色只是半成功运行。这意味着表permission_role
已添加,但提前终止。因此,迁移永远不会标记为完成并添加到migrations
表中。它尝试重新运行权限迁移文件,但由于表已存在而失败。您需要手动将旧的迁移文件添加到数据库,或者使其成功运行。
可以删除代码,或将其包装在if语句中 Is there any way to detect if a database table exists with Laravel
答案 1 :(得分:0)
确保数据库中没有实际存在的表,而down()方法应该包含能够删除该表的代码。
答案 2 :(得分:0)
在使用命令php artisan migrate
之前,您必须先使用命令“"php artisan migrate:refresh"
”在迁移表中记录迁移原始文件,并且还需要更正down方法。
migrate:refresh 命令将首先回滚所有数据库迁移,然后运行migrate命令。此命令有效地重新创建整个数据库:
php artisan migrate:refresh
php artisan migrate:refresh --seed
请参阅此documentation。
答案 3 :(得分:0)
将这行代码放入迁移
if(!Schema::hasTable('post')){
Schema::create('post', function (Blueprint $table) {
$table->increments('id');
#etc
});
}