在 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 tablexxx
添加约束answers_user_id_foreign外键(user_id
)引用users
(id
)删除级联)
那也许你应该把它报告为一个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”的主要内容,如果未能解决你的问题,请参考以下文章