在 Laravel 的现有列中添加“ON DELETE CASCADE”

Posted

技术标签:

【中文标题】在 Laravel 的现有列中添加“ON DELETE CASCADE”【英文标题】:Add "ON DELETE CASCADE" to existing column in Laravel 【发布时间】:2015-01-05 09:33:47 【问题描述】:

我的表中有 user_id fk 列

$table->foreign('user_id')->references('id')->on('users');

我应该将级联删除功能添加到这个现有的列。我该怎么做?

【问题讨论】:

使用原始查询DB::statement('..')。你的桌子叫什么名字? 表格名称为“answers” 【参考方案1】:
$table->foreign('user_id')
      ->references('id')->on('users')
      ->onDelete('cascade');

【讨论】:

[Illuminate\Database\QueryException] SQLSTATE[HY000]: 一般错误: 1005 Can't create table 'xxx.#sql-5d7_226' (errno: 121) (SQL: alter table xxx添加约束answers_user_id_foreign外键(user_id )引用usersid)删除级联) 那也许你应该把它报告为一个bug,因为那是官方的documented method【参考方案2】:

Laravel 模式构建器无法修改当前状态的列,因此您将使用原始查询。您将不得不删除并重新创建 约束

PostgreSQL

function up()

    DB::statement('alter table answers drop constraint answers_user_id_foreign,
                   add constraint answers_user_id_foreign
                   foreign key (user_id)
                   references users(id)
                   on delete cascade;'
    );

function down()

    DB::statement('alter table answers drop constraint answers_user_id_foreign,
                   add constraint answers_user_id_foreign
                   foreign key (user_id)
                   references users(id);'
    );

MySQL

function up()

    DB::statement('alter table answers drop FOREIGN KEY answers_user_id_foreign;');
    DB::statement('alter table answers add constraint answers_user_id_foreign
                   foreign key (user_id)
                   references users(id)
                   on delete cascade;'
    );

function down()

    DB::statement('alter table answers drop FOREIGN KEY answers_user_id_foreign;');
    DB::statement('alter table answers add constraint answers_user_id_foreign
                   foreign key (user_id)
                   references users(id);'
    );

【讨论】:

【参考方案3】:
$table->integer('user_id')->unsigned();    
$table->foreign('user_id')
      ->references('id')->on('users')
      ->onDelete('cascade');

我假设您使用Illuminate\Database\Schema\Blueprint::primary() 创建users.id。如果是这种情况,那么 users.id 将是未签名的。因此,您的外键列 user_id 也必须是无符号的。

【讨论】:

【参考方案4】:

先删除外键。感谢Razor 的提示

$table->dropForeign('answers_user_id_foreign');
$table->foreign('user_id')
->references('id')->on('users')
->onDelete('cascade');

【讨论】:

@BrentConnor 如果它已经迁移并投入生产,是的。否则,您可以回滚迁移,编辑原始文件,然后再次迁移。 至少在 laravel 5.7 中的 $table->dropForeign('answers_user_id_foreign');必须是:$table->dropForeign(['template_id']); 更短,删除外键时不需要知道命名约定:$table->dropForeign(['user_id']) 如果我们删除外键,这些列或表上的数据会发生什么? @PrafullaKumarSahu 您只是在删除外键定义。您不会丢失任何数据。【参考方案5】:

感谢您的问题回答。帮助我在 L5.1 中找到这个工作代码:

public function up()

    Schema::table('transactions', function (Blueprint $table) 
        $table->dropForeign('transactions_order_id_foreign');
        $table->foreign('order_id')
            ->references('id')->on('orders')
            ->onDelete('cascade')
            ->change();
    );

    Schema::table('orders', function (Blueprint $table) 
        $table->dropForeign('orders_user_id_foreign');
        $table->foreign('user_id')
            ->references('id')->on('users')
            ->onDelete('cascade')
            ->change();
    );

【讨论】:

【参考方案6】:

在我的情况下,我需要将 col 名称放在一个数组中,否则会出错。

Schema::table('transactions', function (Blueprint $table) 
    $table->dropForeign(['transactions_order_id_foreign']);
    $table->foreign('order_id')
        ->references('id')->on('orders')
        ->onDelete('cascade')
        ->change();
);

mysql 5.7 版本

【讨论】:

$table->dropForeign(['tank_id']); $table->foreign('tank_id')->references('id')->on('tanks')->onDelete('cascade')->change();【参考方案7】:

在当前迁移中使用无符号函数user_id

$table->interger('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('table_name')->onDelete('cascade');

【讨论】:

【参考方案8】:

小代码

$table->foreignId('user_id')->constrained('users');

【讨论】:

以上是关于在 Laravel 的现有列中添加“ON DELETE CASCADE”的主要内容,如果未能解决你的问题,请参考以下文章

根据条件在现有列中添加新行

如何在dataTable现有列中添加静态数据列

在 Postgres 中的现有列中添加“串行”

将 :default => true 添加到现有 Rails 列中的布尔值

下一个键/值对在尝试使用新键添加对时覆盖散列中的现有对

Laravel迁移在现有数据库表中添加列问题