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

Posted

技术标签:

【中文标题】如何将具有外键的列修改为 null?【英文标题】:How do I modify a column to null that has foreign key? 【发布时间】:2019-06-18 05:53:44 【问题描述】:

我必须将user_id列的类型从accounts改为nullable,但它是用户id列的外键,应该如何正确完成?

我正在与Laravel 5.6.27mysql 5.6 合作, 我尝试使用门面的功能,但它不起作用。 现在我正在测试这些语句,我有这个错误:

在 Connection.php 第 664 行: SQLSTATE [HY000]:一般错误:1025 将“./gonano/#sql-c_b”重命名为“./gonano/accounts”时出错(错误号:150 - 键约束格式不正确)(SQL:ALTER TABLE 帐户更改user_id user_id INT DEFAULT NULL)

创建用户表:

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 可以为空,但我无法实现,谢谢帮助

【问题讨论】:

Migration: Cannot add foreign key constraint in laravel的可能重复 【参考方案1】:

创建新的迁移以使您的 user_id 可以为空。

并将此代码粘贴到您的迁移中。

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;');

【讨论】:

或按照手册中的建议使用 \Illuminate\Support\Facades\Schema::disableForeignKeyConstraints(),然后使用 \Illuminate\Support\Facades\Schema::enableForeignKeyConstraints() 感谢您的回答 Prathamesh 和 Indra,但我遇到了一个新错误。我用新错误更新了问题 @PrathameshDoke 我也更新了问题中的代码

以上是关于如何将具有外键的列修改为 null?的主要内容,如果未能解决你的问题,请参考以下文章

删除具有外键的列

如何从具有两个外键的表中访问列?

如何在Django的同一个表中阻止外键的相同对象引用?

删除具有外键约束且无级联删除 SQL 的行

Laravel - 如何将外键用于具有识别外键的表?

休眠:外键的列数错误