外键约束:不能删除表,因为其他对象依赖于它

Gro*_*ler 0 postgresql laravel laravel-5.1

我正在Laravel 5.1上运行迁移,并且正在将数据库从Mysql切换到Postgres.

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

- DB::statement('SET FOREIGN_KEY_CHECKS = 0');
- Do stuff
- DB::statement('SET FOREIGN_KEY_CHECKS = 1');
Run Code Online (Sandbox Code Playgroud)

Postgres不提供这个.

在减少迁移时,我收到错误:

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

详细信息:表table1_table2上的约束table1_table2_table1_id_foreign取决于表table2

提示:使用DROP ... CASCADE也可以删除相关对象.(SQL:drop table"table2")

问题:当我设置->onDelete('cascade');外国创作时,这个投诉对我很好奇.为什么会这样?

摘录:

创建Table1表:

...
public function down()
{
    Schema::drop('table1_table2');
    Schema::drop('table1'); 
}
Run Code Online (Sandbox Code Playgroud)

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

...
public function down()
{
    Schema::drop('table2'); 
}
Run Code Online (Sandbox Code Playgroud)

创建外键表(要调用的上次迁移)

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');
    });
    ...
}
Run Code Online (Sandbox Code Playgroud)

IMS*_*SoP 5

当我设置时,这个投诉对我很好奇 - > onDelete('cascade'); 关于外国创作.为什么会这样?

这里的关键术语是"on delete" - 当您一个表中删除一行时,该选项将确定是否也会删除引用行的带有外键的.

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

所述CASCADE在所述提示提到是对一个关键字的DROP TABLE语句,"依赖跟踪"下的手册中讨论:

关键报价:

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

和:

如果您不想单独删除所有依赖对象,则可以运行DROP TABLE products CASCADE;并删除所有依赖对象,以及递归依赖它们的任何对象.在这种情况下,它不会删除orders表,它只删除外键约束.

和:

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