【问题标题】:How do I modify a column to null that has foreign key?如何将具有外键的列修改为 null?
【发布时间】: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 可以为空,但我无法实现,谢谢帮助

【问题讨论】:

标签: php mysql 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 我也更新了问题中的代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
  • 2017-08-16
  • 2021-11-23
  • 1970-01-01
相关资源
最近更新 更多