在laravel中用顺序id替换复合主键

时间:2018-02-21 12:46:29

标签: php laravel postgresql eloquent

我有一张带有复合主键的表。我想创建一个删除该主键的迁移,并引入一个新的列'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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

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

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

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

问题是交易尚未提交,因此将其作为两个交易应该可以解决问题。