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)
当我设置时,这个投诉对我很好奇 - > onDelete('cascade'); 关于外国创作.为什么会这样?
这里的关键术语是"on delete" - 当您从一个表中删除一行时,该选项将确定是否也会删除引用该行的带有外键的行.
但是,您的更改脚本不是删除行,而是删除表.因此,这是一个不同的事件,不受ON DELETE外键选项的影响.
所述CASCADE在所述提示提到是对一个关键字的DROP TABLE语句,"依赖跟踪"下的手册中讨论:
关键报价:
当您创建涉及许多具有外键约束,视图,触发器,函数等的表的复杂数据库结构时,您隐式地创建了对象之间的依赖关系网.例如,具有外键约束的表取决于它引用的表.
和:
如果您不想单独删除所有依赖对象,则可以运行
DROP TABLE products CASCADE;并删除所有依赖对象,以及递归依赖它们的任何对象.在这种情况下,它不会删除orders表,它只删除外键约束.
和:
PostgreSQL中的几乎所有DROP命令都支持指定CASCADE.
| 归档时间: |
|
| 查看次数: |
1781 次 |
| 最近记录: |