我有items
表supplier_id
列和该列的外键。该列不可为空,我想让它可以为空。因此up()
方法有效:
$table->integer('supplier_id')->unsigned()->nullable()->change();
但是我无法使down()
方法工作,总是会收到错误:
Cannot change column 'supplier_id': used in a foreign key constraint 'items_supplier_id_foreign'
最新尝试:
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('items', function (Blueprint $table) {
$table->dropForeign(['supplier_id']);
$table->integer('supplier_id')->unsigned()->nullable(false)->change();
$table->foreign('supplier_id')->references('id')->on('suppliers');
});
}
有什么建议吗?我使用的是Laravel 5.4
答案 0 :(得分:0)
@apokryfos是对的。见here
在对表进行任何更改之前,重要的是简要地查看在您希望更改为NOT NULL的现有列中可以(并且不能)指定哪些数据,确保不允许任何行具有NULL该栏中的价值。
首先,您需要使用seeds填充所有可空值,然后修改列。或者您可以删除supplier_id
而不是使用default()
方法填充表格中的所有行。
答案 1 :(得分:0)
如果接下来要更改列,仅删除外键约束是不够的,还必须删除其索引。下面是向下迁移功能
Schema::table('users', function (Blueprint $table) {
$table->dropForeign('users_role_id_foreign');
$table->dropIndex('users_role_id_foreign');
});
// Conflict with change on same Blueprint instance (strange)
Schema::table('users', function (Blueprint $table) {
$table->integer('role_id')->change();
});
积分:Github