mysql - 将主键从 id 切换为数据透视表中的值组合

标签 mysql laravel

我正在尝试使用 Laravel 项目内的迁移将数据透视表的主键从“id”切换为两个值的组合。我的 up 方法如下所示,并且工作正常:


public function up() {
 Schema::table('gallery_image', function (Blueprint $table) {

  $table->dropColumn('id');

  $table->primary(['image_id', 'gallery_id']);

 });
}

但是,当我声明 down 方法以撤消上述更改时,如下所示:

public function down() {
 Schema::table('gallery_image', function (Blueprint $table) {

  $table->dropPrimary(['image_id', 'gallery_id']);

  $table->increments('id');

 });

它首先给我一个错误1068 Multiple Primary key Defined,它告诉我down方法中的第一行没有按预期工作,但是当我只是运行 dropPrimary 行,它给我一个错误 errno: 150 - 外键约束格式不正确

我不太确定我做错了什么。

最佳答案

您可以尝试以下方法

$table->dropPrimary(); // without the parameters.

或者您可以将闭包包装在 down 方法中,如下所示:

DB::statement('SET FOREIGN_KEY_CHECKS=0');
$table->dropPrimary(['image_id', 'gallery_id']);
$table->increments('id');
DB::statement('SET FOREIGN_KEY_CHECKS=1');

or 

Schema::disableForeignKeyConstraints();
//code
Schema::enableForeignKeyConstraints();

这将暂时关闭 FK 检查,然后再将其重新打开。

编辑

您可以查看https://laravel.com/docs/6.0/migrations#dropping-indexes并尝试各种功能!

关于mysql - 将主键从 id 切换为数据透视表中的值组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57920715/

相关文章:

php - Laravel `with` 问题

php - Apache 的 Laravel 文件权限

javascript - Laravel Vue.js 应用程序未运行

php - 使用 Laravel Socialite 登录 facebook

php - 使用 PHP 在 MySQL 中存储时间

java - 我如何为我的 api 实现登录系统

mysql - 从与另一个表关联的表中删除重复项

mysql - 如何计算当前和以前的日期?

mysql - 将 count(*) 与 SQL 语句合并到一张表中

php - Laravel Eloquent 查询中的 Intval 函数