【问题标题】:Replacing composite primary key with sequential id in laravel在laravel中用顺序id替换复合主键
【发布时间】:2018-02-21 12:46:28
【问题描述】:

我有一个包含复合主键的表。我想创建一个迁移,删除该主键并引入一个新的列“id”,该列是连续的,将成为新的主键。

Schema::table('cart_line', function (Blueprint $table) {
    $table->dropPrimary('cart_line_pkey');
    $table->increments('id');
    $table->primary('id');
});

此代码引发以下错误:

SQLSTATE[42P16]: Invalid table definition: 7 ERROR:  multiple primary keys for table "cart_line" are not allowed (SQL: alter table "cart_line" add primary key ("id"))

如果我直接执行下面的SQL,主键被删除,上面的代码执行没有错误:

ALTER TABLE cart_line DROP CONSTRAINT cart_line_pkey;

这就是我尝试的原因

DB::statement('ALTER TABLE cart_line DROP CONSTRAINT cart_line_pkey;');

Schema::table('cart_line', function (Blueprint $table) {
    $table->increments('id');
    $table->primary('id');
});

但同样的错误被抛出。旧的主键不会被删除,但在尝试创建新主键之前不会出错。

我正在使用 laravel 5.5 和 postgres 9.6

【问题讨论】:

  • $table->increments('id'); 已经是主键了

标签: php laravel postgresql eloquent


【解决方案1】:

删除$table->primary('id') 因为 $table->increments('id')使id列主键

Schema::table('cart_line', function (Blueprint $table) {
    $table->dropPrimary('cart_line_pkey');
    $table->increments('id');
});

【讨论】:

  • 事实证明这是这个和 btl 描述的问题的结合。我接受另一个答案,因为它包含正确的代码。
【解决方案2】:

您需要在单独的闭包中执行此操作,因此请尝试以下操作:

Schema::table('cart_line', function (Blueprint $table) {
    $table->dropPrimary('cart_line_pkey');
});

Schema::table('cart_line', function (Blueprint $table) {
    $table->increments('id');
});

问题是事务还没有提交,所以做两个事务应该可以解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    相关资源
    最近更新 更多