28

我的外键与它自己的表有关。这是为了产生具有层次结构的帖子

现在,当我尝试在数据库中删除该列时,它给了我这个错误:

1553 - Cannot drop index 'post_field_properties_parent_id_index': needed in a foreign key constraint

这是代码:

public function down()
{
        Schema::table( "post_field_properties", function( $table )
        {
            $table->dropForeign('parent_id');
            $table->dropColumn('parent_id');
        } );
}

我似乎能够做到的唯一方法是转到 phpmyadmin 并删除外键本身。然后删除该列。

4

5 回答 5

42

刚刚为我自己的项目解决了这个问题。删除外键时,需要连接表名和约束中的列,然后在名称后缀“_foreign”

http://laravel.com/docs/5.1/migrations#foreign-key-constraints

public function down()
{
        Schema::table( "post_field_properties", function( $table )
        {
            $table->dropForeign('post_field_properties_parent_id_foreign');
            $table->dropColumn('parent_id');
        });
}
于 2015-10-28T20:20:48.360 回答
15

这是如何做到的:

  1. 登录到您的数据库并查找外键关系的名称。如果你使用phpmyadmin,进入表格,点击“结构”选项卡,点击链接“关系视图”</li>

重要提示: 要查看“关系视图”,请确保您的表“存储引擎”是InnoDB如果没有查看此问答

并等待几秒钟以加载。搜索“约束名称”字段。在我的示例中,这是:“contribution_copyright_id_foreign”</p>

  1. 转到 Laravel 迁移脚本(或创建一个)。诀窍是首先删除外键关系,然后删除列。

    公共函数向下()

    {

         Schema::table('contribution', function(Blueprint $table){
    
             $table->dropForeign('contribution_copyright_id_foreign');
    
             $table->dropColumn('copyright_id');
    
         });
    

如果要删除存在外键的表,还必须首先删除外键关系。

从这里复制

希望它可以帮助某人

于 2018-04-25T12:33:46.337 回答
1

尝试将“_foreign”放在列名的末尾。例如:

public function down()
{
        Schema::table( "post_field_properties", function( $table )
        {
            $table->dropForeign('parent_id_foreign');
            $table->dropColumn('parent_id');
        });
}
于 2014-10-29T10:48:30.547 回答
1

要检查外键的名称,首先将您的数据库备份到 .sql

在那里你会看到你的外键的名字是这样的:

...
KEY `employees_parent_id_foreign` (`parent_id`),
CONSTRAINT `employees_parent_id_foreign` FOREIGN KEY (`parent_id`) REFERENCES `laravel_article` (`id`) ON DELETE CASCADE
...

在我的情况下是laravel 5.4,它以这种格式开始:tablename_columnname_foreign

所以在你的 laravel 中(这里我尝试从员工表中删除外键)

Schema::table("employees", function( $table )
{
    $table->dropForeign('employees_parent_id_foreign');
    $table->dropColumn('parent_id');
});
于 2017-06-03T07:55:57.470 回答
1

你可以在函数内部传递一个外键数组dropForeign(),所以 Laravel 会自动连接键名开头的表名和结尾的 'foreign'。

所以请在你的 down() 函数中尝试类似下面的代码。

 Schema::table('contribution', function(Blueprint $table){
     $table->dropForeign(['copyright_id']);
     $table->dropColumn('copyright_id');
 });
于 2021-12-28T18:05:07.137 回答