【问题标题】:foreign key constraint: cannot drop table because other objects depend on it外键约束:不能删除表,因为其他对象依赖它
【发布时间】:2018-05-14 21:29:36
【问题描述】:

我正在 Laravel 5.1 上运行迁移,并将 DB 从 Mysql 切换到 Postgres。

通常我可以在运行 down 迁移之前将外键检查设置为 0:

- DB::statement('SET FOREIGN_KEY_CHECKS = 0');
- Do stuff
- DB::statement('SET FOREIGN_KEY_CHECKS = 1');

Postgres 不提供此功能。

在运行迁移时,我收到错误:

依赖对象仍然存在:7 错误:无法删除表 table2,因为其他对象依赖于它

DETAIL:table1_table2 上的约束 table1_table2_table1_id_foreign 依赖于 table2

提示:使用 DROP ... CASCADE 也可以删除依赖对象。 (SQL:删除表“table2”)

问题:当我在外键创建上设置->onDelete('cascade'); 时,我对这个投诉感到好奇。为什么会这样?

片段:

创建 Table1 表:

...
public function down()
{
    Schema::drop('table1_table2');
    Schema::drop('table1'); 
}

创建 Table2 表(在表 1 迁移后调用):

...
public function down()
{
    Schema::drop('table2'); 
}

创建外键表(要调用的最后一次迁移)

public function up()
{
  Schema::table('table1_table2', function(Blueprint $table)
  {
    $table->foreign('table1_id')->references('id')->on('table1')->onDelete('cascade');
    $table->foreign('table2_id')->references('id')->on('table2')->onDelete('cascade');
  });
  ...
 }

public function down()
{
    ...
    Schema::table('table1_table2', function(Blueprint $table)
    {
        $table->dropForeign('table1_id');
        $table->dropForeign('table2_id');
    });
    ...
}

【问题讨论】:

    标签: laravel postgresql laravel-5.1


    【解决方案1】:

    当我设置 ->onDelete('cascade'); 时,我对这个抱怨很感兴趣关于外键创作。为什么会这样?

    这里的关键术语是“删除时” - 当您从一个表中删除一行时,该选项将确定是否具有引用该行的外键的行也删了。

    但是,您的更改脚本不会删除行,而是删除表格。因此,这是一个不同的事件,不受外键上的 ON DELETE 选项的影响。

    提示中提到的CASCADE是DROP TABLE语句上的关键字discussed in the manual under "Dependency Tracking":

    关键引号:

    当您创建涉及具有外键约束、视图、触发器、函数等的许多表的复杂数据库结构时,您会隐式创建对象之间的依赖关系网络。例如,具有外键约束的表依赖于它所引用的表。

    和:

    如果您不想单独删除所有依赖对象,您可以运行DROP TABLE products CASCADE;,所有依赖对象都将被删除,任何依赖于它们的对象也将被递归删除。在这种情况下,它不会删除订单表,它只会删除外键约束。

    和:

    PostgreSQL 中几乎所有的 DROP 命令都支持指定 CASCADE。

    【讨论】:

      【解决方案2】:

      就我而言;在这种情况下你会得到这个错误;

      如果您的表似乎在迁移表中回滚(例如:可能第一次忘记删除功能)但表仍然存在于数据库中,您可能会收到此错误。对于这种情况,migrate:fresh 命令将失败并显示给定的错误消息。

      您可以手动删除表或使用该迁移名称向迁移表添加一行,一切都会正常工作。

      【讨论】:

        猜你喜欢
        • 2017-04-14
        • 2018-09-01
        • 2016-05-22
        • 2013-06-06
        • 2020-12-27
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多