代码之家  ›  专栏  ›  技术社区  ›  LorenzSchaef

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

  •  0
  • LorenzSchaef  · 技术社区  · 7 年前

    我有一个带有复合主键的表。我想创建一个迁移,删除该主键并引入一个新的列“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 回复  |  直到 7 年前
        1
  •  6
  •   Mahdi Younesi    7 年前

    去除 $table->primary('id') 因为 $table->increments('id') 生成id列 主键,主键

    Schema::table('cart_line', function (Blueprint $table) {
        $table->dropPrimary('cart_line_pkey');
        $table->increments('id');
    });
    
        2
  •  1
  •   user320487 user320487    7 年前

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

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

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