【问题标题】:Migration tables with different level不同级别的迁移表
【发布时间】:2019-11-06 15:03:21
【问题描述】:

当我有具有关系的表(父表和子表)时,我可以同时迁移它们还是需要先迁移子表?

【问题讨论】:

  • 先迁移父节点

标签: laravel eloquent eloquent-relationship


【解决方案1】:

您不能一次迁移两个表,代码不会并行处理

而且先迁移孩子会报错

Illuminate\Database\QueryException : SQLSTATE[HY000]: 一般错误: 1005 无法创建表database.child (errno: 150 "外键约束格式不正确")

所以你必须先迁移父节点

例如,假设用户有一只宠物(家养动物)

我们会有users 表和pets 表设置

Schema::create('pets', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->unsignedBigInteger('user_id');
    $table->foreign('user_id')->references('id')->on('users');
    $table->timestamps();
});

如果宠物迁移的文件名是

2013_11_06_151235_create_pets_table.php

users 迁移的文件名是

2014_10_12_000000_create_users_table.php

您会收到上述错误,因此您必须将pets 表迁移文件重命名为晚于users 的日期

例如

2015_11_06_151235_create_pets_table.php

因为 Laravel 会尝试创建一个数据库表,其中一个列引用了一个尚不存在的表中的列

希望对你有帮助

【讨论】:

  • 代码到达时表存在,Laravel 会开始从最旧迁移到最新
  • 我2019年有两次migration,然后按你说的做了,我把child改名为2020,然后我就migrate了,childmigration迁移成功了。但是现在我想迁移父母,我该怎么办?
【解决方案2】:

如果您没有外键约束,那么您可以按任意顺序迁移。但是,如果您确实有外键 (FK),那么这取决于您的方案,那么您也可以从为您的表指定 ON UPDATEON DELETE 规则中受益。请参阅mysql docs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多