在 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;检查列/键是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:即使使用“dropForeign”方法也不能删除外键

MySQL更改外键类型

主索引列上的 MySQL 表外键索引

Laravel 外键约束报错

无法在 Laravel 迁移中添加外键约束

Laravel 迁移语法错误或访问冲突 1064