在 laravel 中删除无符号索引外键。语法错误或访问冲突:1091 Can't DROP;检查列/键是不是存在
Posted
技术标签:
【中文标题】在 laravel 中删除无符号索引外键。语法错误或访问冲突:1091 Can\'t DROP;检查列/键是不是存在【英文标题】:Dropping unsigned index foreign key in laravel. Syntax error or access violation: 1091 Can't DROP; check that column/key exists在 laravel 中删除无符号索引外键。语法错误或访问冲突:1091 Can't DROP;检查列/键是否存在 【发布时间】:2020-01-22 13:45:52 【问题描述】:我使用以下方法创建了迁移
Schema::table('packages', function (Blueprint $table)
$table->integer('star_id')->unsigned()->index()->nullable()->default(null);
$table->foreign('star_id')->references('id')->on('star');
);
在下降部分
Schema::table('packages', function (Blueprint $table)
$table->dropForeign('star_id');
//$table->dropIndex('star_id'); //also tried dropIndex
$table->dropColumn('star_id');
);
但它会抛出索引和外部
SQLSTATE[HY000]:一般错误:1553 无法删除索引 'packages_star_id_index':在外键约束中需要(SQL: 更改表
packages
删除star_id
)
dropForeign 错误
SQLSTATE[42000]:语法错误或访问冲突:1091 Can't DROP 'star_id';检查列/键是否存在(SQL:alter table
packages
删除外键star_id
)
由于错误,我无法回滚。
【问题讨论】:
【参考方案1】:您必须自己传递外键名称或将列名传递到数组中,以便 laravel 自动构建它。
见here:
如果给定的“索引”实际上是一个列数组,开发者 意味着仅通过指定所涉及的列来删除索引 没有常规名称,所以我们将建立索引名称 列。
// laravel assumes star_id is the foreign key name
$table->dropForeign('star_id');
// laravel builds the foreign key name itself e.g. packages_star_id_foreign
$table->dropForeign(['star_id']);
所以在你的情况下,只需传递数组中的列:
Schema::table('packages', function (Blueprint $table)
$table->dropForeign(['star_id']);
$table->dropColumn('star_id');
);
【讨论】:
【参考方案2】:块引用 SQLSTATE[HY000]:一般错误:1553 无法删除索引“packages_star_id_index”:在外键约束中需要(SQL:alter table packages drop star_id)
根据您的错误,索引名称为“packages_star_id_index”。 您应该在 dropForeign 函数中提及正确的索引名称。
试一试:
Schema::table('packages', function (Blueprint $table)
$table->dropForeign('packages_star_id_index');
$table->dropColumn('star_id');
);
【讨论】:
【参考方案3】:基于 Laravel 7 文档,用于删除外键 此代码将起作用:
$table->dropForeign('posts_user_id_foreign');
其中“posts”为表名,“user_id”为外键名,“foreign”为后缀。
还有另一种只在数组中传递外键名的方法:
$table->dropForeign(['user_id']);
这张图片来自 Laravel 网站 (v 7.x): here
【讨论】:
以上是关于在 laravel 中删除无符号索引外键。语法错误或访问冲突:1091 Can't DROP;检查列/键是不是存在的主要内容,如果未能解决你的问题,请参考以下文章