在当前向上迁移函数中删除然后创建相同的列

Drop and then create same columns in current up migration function

Schema::table('users', function (Blueprint $table) {
            $table->dropTimestamps();
            $table->dropColumn(['email', 'bio']);

            $table->string('email', 20)->unique()->after('id');
            $table->string('bio', 150)->after('surname');
            $table->timestamps();
        });

这就是我现在所拥有的。因此,我的 table 中已有 atm 列,但我想对它们进行一些修改和重新排列。但是当我 运行 迁移时,我得到 SQL 错误,指出 email 列存在。我可能也会对 biotimestamps 得到同样的错误。我有点理解为什么会这样,所以我想问的只是一个解决方法。

是否可以在一次迁移中完成我想要的,或者我必须创建一个迁移来删除列,然后再创建一个单独的迁移来按照我想要的方式创建它们?

只需将架构分成两个调用

public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->dropTimestamps();
        $table->dropColumn(['email', 'bio']);
    });

    Schema::table('users', function (Blueprint $table) {
        $table->string('email', 20)->unique()->after('id');
        $table->string('bio', 150)->after('surname');
        $table->timestamps();
    });
}

通过这种方式,更改发生在一次 迁移 和两次数据库调用中。

考虑一下,如果您删除这些列,您将丢失其中包含的所有数据。通常这是一个非常糟糕和危险的想法。如果您只需要更改参数,则应使用 change() 函数对您的模式进行必要的修改。这会将现有数据转换为您的数据库的最佳能力。

永远不要在使用中的数据库中删除列,除非您完全知道自己在做什么。

    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            // Add the unique constraint, for example
            $table->string('email', 20)->unique()->after('id')->change();
            // Add the length to the bio, for example
            $table->string('bio', 150)->after('surname')->change();
        });
    }

    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            // Remove length and constraints
            $table->string('email')->unique(false)->change();
            $table->string('bio')->change();
        });
    }