丢弃外键的问题

时间:2014-10-29 10:37:40

标签: php mysql laravel artisan

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

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

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 个答案:

答案 0 :(得分:17)

刚刚为我自己的项目想出了这个。删除外键时,需要连接约束中的表名和列,然后将名称后缀为“_ 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');
        });
}

答案 1 :(得分:3)

以下是如何操作:

1)登录到您的数据库并查找外键关系的名称。如果您使用phpmyadmin,请转到表格,单击“结构”选项卡,单击“关系视图”链接并等待几秒钟以加载它。搜索“约束名称”字段。在我的示例中,这是:“contribution_copyright_id_foreign”

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

public function down()

 {

        Schema::table('contribution', function(Blueprint $table){

            $table->dropForeign('contribution_copyright_id_foreign');

            $table->dropColumn('copyright_id');

        });

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

here

复制

希望有人帮助

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

要检查外键的名称,请先将数据库备份到.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');
});