当前位置: 首页 > 知识库问答 >
问题:

在Laravel 5迁移中处理外国支票

卫嘉谊
2023-03-14

我有一个calls表,其中包含user\u id列和一个外键约束。因此,用户id与用户表相关。

我进行了迁移,删除了列和外键约束。up方法工作正常。但是,当谈到down时,它会崩溃,因为我添加了一个user\u id列,然后恢复约束,但是该列中的值与实际数据无关,所以我得到了150个MySQL错误。

我找到了一个不适合我的解决方案。解决办法是暂时禁用外键约束。这是我的迁移文件:

使用Illumb\Database\Schema\Blueprint;使用\Database\Migrations\Migration;

class RemoveUseridFromCalls extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('calls', function(Blueprint $table)
        {
            $table->dropForeign('calls_user_id_foreign');
            $table->dropColumn('user_id');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        \DB::statement('SET FOREIGN_KEY_CHECKS = 0');

        Schema::table('calls', function(Blueprint $table)
        {
            $table->integer('user_id')->unsigned();

            $table->foreign('user_id')
                ->references('id')
                ->on('users')
                ->onDelete('set null');
        });

        \DB::statement('SET FOREIGN_KEY_CHECKS = 1');
    }

}

但我还是犯了同样的错误。

所以,问题是:

>

  • 如果你需要从列表中删除user_id,因为它不再需要了,但是你必须写下方法和上方法,你会怎么做?

    为什么禁用外键检查不起作用?

    我使用InnoDB作为我所有表的表类型。

  • 共有3个答案

    戚飞雨
    2023-03-14

    在处理迁移时检查表中的外键可以如下:

    $keyExists = DB::select(DB::raw('SHOW KEYS FROM TABLE_NAME WHERE Key_name=\'YOUR_FOREIGN_KEY_NAME\''));
    
    if(!$keyExists){
        $table->foreign('app_id')
            ->references('id')
            ->on('apps')
             ->onDelete('cascade');
    }
    
    伯向晨
    2023-03-14

    我也有同样的问题,并通过将迁移分离到几个文件来修复它。第一个创建表,其他的为键和键本身添加列。

    从那以后,一切都开始运转起来。

    阮疏珂
    2023-03-14

    您只需使用onDelete('cascade')

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('calls', function(Blueprint $table)
        {
            $table->increments('id');
            $table->integer('user_id')->unsigned();
            $table->timestamps();
    
            $table->foreign('user_id')
                ->references('id')
                ->on('users')
                ->onDelete('cascade'); // use 'cascade'
        });
    }
    
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('calls');
    }
    

    }

    onDelete('cascade')告诉Laravel删除一个调用的行,当它对应的外键用户id被删除时。

     类似资料:
    • 本文向大家介绍Django 处理迁移,包括了Django 处理迁移的使用技巧和注意事项,需要的朋友参考一下 示例 Django使用迁移将您对模型所做的更改传播到数据库。django大多数时候都可以为您生成它们。 要创建迁移,请运行: 这将在的migration子模块中创建一个迁移文件app_name。第一个迁移将被命名0001_initial.py,另一个将以开头0002_,然后0003是...

    • 我已经创建了一个迁移文件,并在数据库中创建了表。现在,我想向现有迁移文件添加新列。我要做的是,打开迁移文件并在up()函数中添加列名,添加列名后,运行命令 如何向现有表中添加新列?

    • 获取以下异常: 预期: TableInfo{name='chat_table',Columns={message=column{name='message',type='text',affinity='2',notnull=false,primarykeyposition=0},messageStatus=column{name='message status',type='text',affin

    • java.lang.IllegalStateException:迁移未正确处理data_table 应为:TableInfo{name=“data_table”,columns=url=column{name=“url”,type=“text”,notnull=false,primarykeyposition=0}..... 找到:TableInfo{name='data_table',colum

    • 我目前正在研究Flyway作为Liquibase的替代方案,但在文档中无法找到以下问题的答案: 假设在生产环境中部署后发现迁移包含错误。回想起来,不应该按原样执行,但已经太晚了。但是,我们想用固定版本的替换迁移,这样从头开始填充的数据库就不会遭受相同的错误。 在 Liquibase 中,您将修复原始变更集并使用

    • 预期: 找到TableInfo{name='user',Columns={name=Column{name='name',Type='text',NotNull=False,PrimaryKeyPosition=0},Age=Column{name='Age',Type='integer',NotNull=True,PrimaryKeyPosition=0},ID=Column{name='id'