使用迁移更改表结构而不会丢失数据?

时间:2016-10-21 11:47:36

标签: laravel migration

我已经阅读了几个有关此问题的主题,但仍然不是我的问题。 所以在users表中我有一个名为role的列,它是枚举类型,有两个可用值:1和2.我将2设置为默认值。例如,现在我想将其更改为1。我创建了一个新的迁移,运行php artisan migrate并遇到此错误:

[Illuminate\DatabaseQueryException]                                           

SQLSTATE[42S21]: Column already exists: 1060 Duplicate column name 'role' (SQL: alter table `u  
  sers` add `role` enum('1', '2') not null default '1')                                                     
[PDOException]                                                             
  SQLSTATE[42S21]: Column already exists: 1060 Duplicate column name 'role' 

以下是我的CreateUsersTable迁移文件中的代码:

$table->enum('role', ['1', '2'])->default('2');

我在新的UpdateUsersTable迁移文件中做了同样的事情:

$table->enum('role', ['1', '2'])->default('1');

顺便说一句,我不能使用php artisan migrate:refresh,因为它会删除我的所有数据。我在哪里做错了?

3 个答案:

答案 0 :(得分:2)

$table->enum('role', ['1', '2'])->default('1')->change();

答案 1 :(得分:1)

<?php

use Illuminate\Support\Facades\DB;
use Illuminate\Database\Migrations\Migration;

class UpdateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        DB::statement('ALTER TABLE `users` MODIFY `role` DEFAULT 1;');
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        DB::statement('ALTER TABLE `users` MODIFY `role` DEFAULT 2;');
    }
}

改编自this answer to another question

答案 2 :(得分:1)

要执行此操作,您必须向添加到迁移文件的每个字段添加->nullable()->default()