如何在laravel中动态禁用和启用外键检查?

p01*_*ath 1 php mysql laravel

我正在尝试将旧表中的条目移动到具有更新架构的新表中。问题是,我必须将内容从具有旧配置的 10 个表移动到具有新配置的 10 个表。

我是在控制台命令的帮助下执行此操作的。当我添加新表并执行命令时,对于已经有数据的表,我收到重复条目错误,这很明显。

当我尝试使用时DB::connection('mysql_old')->table('users')->truncate();,它会抛出错误1701 Cannot truncate a table referenced in a foreign key constraint,这也很明显!

这是我将条目从旧表移动到新表的方式。

$entries = DB::connection('mysql_old')->table('users')->get();
DB::table('users')->truncate();
foreach($entries as $entry){
    $user = \App\User::create([
        'name' => $entry->name,
        'email' => $entry->email,
        'status' => $entry->status,
        'credits' => $entry->credits,
        'role' => $entry->user_role,
        'email_subscription' => $entry->email_subscription,
        'activation_key' => $entry->activation_key,
        'password' => $entry->password,
        'remember_token' => $entry->remember_token,
        'created_at' => $entry->created_at,
        'updated_at' => $entry->updated_at
    ]);
}
Run Code Online (Sandbox Code Playgroud)

唯一的解决方案是在截断之前禁用外键检查并在截断后再次启用它(我认为)。它是一个关系数据库,显而易见。那么,有没有更好的方法来完成这个任务呢?

我想尝试将条目从旧表移动到新表中,a relational way但在这种情况下是不可能的。

php artisan migrate:refresh每次执行命令时我都可以执行该命令。但这里有问题,有超过 25 个表,大约需要 20-30 秒才能完成migrate:refresh

我真的很困惑如何完成这项工作。有什么适当的或标准的方法吗?

Ken*_*rna 11

尝试这个:

Schema::disableForeignKeyConstraints();

// Your database operations go here..

Schema::enableForeignKeyConstraints();
Run Code Online (Sandbox Code Playgroud)

  • 我做了这个 `DB::statement('SET FOREIGN_KEY_CHECKS=0;');` 关闭和打开 `1`。有效!此解决方案更适合指定的问题。 (4认同)

p01*_*ath 6

最后,我找到了关闭和打开外键检查的解决方案。以下是我如何将信息从旧表移动到新表的方法。

// Disable foreign key checks!
DB::statement('SET FOREIGN_KEY_CHECKS=0;');

// Move users from old table to the new one
$entries = DB::connection('mysql_old')->table('users')->get();
DB::table('users')->truncate();
foreach($entries as $entry){
    $user = \App\User::create([
        'name' => $entry->name,
        'email' => $entry->email,
        'status' => $entry->status,
        'credits' => $entry->credits,
        'role' => $entry->user_role,
        'email_subscription' => $entry->email_subscription,
        'activation_key' => $entry->activation_key,
        'password' => $entry->password,
        'remember_token' => $entry->remember_token,
        'created_at' => $entry->created_at,
        'updated_at' => $entry->updated_at
    ]);
}

// Enable foreign key checks!
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
Run Code Online (Sandbox Code Playgroud)

有效!