如何将具有外键的列修改为null?

时间:2019-01-24 13:18:29

标签: php mysql laravel

我必须将user_id列的类型从帐户更改为可为空,但这是具有用户id列的外键,应如何正确完成?

我正在使用Laravel 5.6.27MySQL 5.6, 我尝试使用外观的功能,但是没有用。 现在,我正在测试这些语句,但出现此错误:

  

在Connection.php第664行中:   SQLSTATE [HY000]:常规错误:1025将'./gonano/#sql-c_b'重命名为'./gonano/accounts'时出错(错误号:150-对于关键约束格式不正确)(SQL:ALTER TABLE帐户CHANGE user_id user_id INT默认为NULL)

create_users_table:

public function up(): void
{
    Schema::create('users', function (Blueprint $table): void {
        $table->increments('id');
        $table->string('first_name', 100);
        $table->string('last_name', 100);
        $table->string('email')->unique();
        $table->bigInteger('cuit')->unsigned();
        $table->string('password');
        $table->enum('status', ['activated', 'blocked'])->default('activated');
        $table->integer('country_id')->unsigned()->references('id')->on('countries');
        $table->timestampsTz();
    });
}

create_accounts_table:

public function up(): void
{
    Schema::create('accounts', function (Blueprint $table): void {
        $table->bigIncrements('id');
        $table->string('address')->default('');
        $table->integer('user_id')->index()->unsigned();
        $table->integer('system_id')->index()->unsigned()->default(0);
        $table->foreign('user_id')->references('id')->on('users');
        $table->timestampsTz();
    });
}

change_user_id_to_nullable_in_accounts:

public function up()
{
    Schema::disableForeignKeyConstraints();
    DB::table('accounts')->truncate();
    Schema::table('accounts', function (Blueprint $table): void {
        $table->integer('user_id')->nullable()->change();
    });
    Schema::enableForeignKeyConstraints();
}

我需要user_id可以为空并且我无法实现它,感谢您的帮助

1 个答案:

答案 0 :(得分:1)

创建新迁移,以使user_id可以为空,并将此代码粘贴到您的迁移中。

首先,它将外键检查设置为0,然后将user_id设置为空,然后再次将其设置为1。

迁移代码:

public function up()
{
    \Illuminate\Support\Facades\DB::statement('SET FOREIGN_KEY_CHECKS=0;');
    \Illuminate\Support\Facades\DB::table('accounts')->truncate();
    Schema::table('accounts', function (Blueprint $table) {
        $table->integer('user_id')->nullable()->change();
    });
    \Illuminate\Support\Facades\DB::statement('SET FOREIGN_KEY_CHECKS=1;');
}