Laravel迁移失败了多个主键

时间:2016-01-19 15:10:23

标签: laravel migration primary-key

我正在尝试在Laravel中创建一个Migration但是它没有说我有多个主键。

public function up()
{
    Schema::create('spins', function (Blueprint $table) {
        $table->integer('rid', true, true);
        $table->bigInteger('pid');
        $table->integer('result');
        $table->integer('bet');
        $table->timestamps();
        $table->primary(array('rid', 'pid'));
    });
}

错误:

SQLSTATE[42000]: Syntax error or access violation: 1068 Multipleprimary key defined 
(SQL: alter table `spins` add primary key `spins_rid_pid_primary` (`rid`, `pid`))      

3 个答案:

答案 0 :(得分:6)

rid的自动增量是问题(下面一行中的第二个参数)。

$table->integer('rid', true, true);

如果您使用InnoDB作为MySQL引擎,它不允许复合主键具有自动增量。

如果您更改为MyISAM引擎,则可以这样做。

  1. $table->engine = 'MyISAM';添加到您的迁移。

  2. rid字段声明为普通整数列

  3. Laravel没有提供更改现有列的方法,因此您需要运行原始SQL查询:DB::statement('ALTER TABLE spins MODIFY rid INTEGER NOT NULL AUTO_INCREMENT');

  4. public function up()
    {
        Schema::create('spins', function (Blueprint $table) {
            $table->engine = 'MyISAM';
            $table->integer('rid')->unsigned();
            $table->bigInteger('pid');
            $table->integer('result');
            $table->integer('bet');
            $table->timestamps();
            $table->primary(array('rid', 'pid'));
    
            DB::statement('ALTER TABLE spins MODIFY rid INTEGER NOT NULL AUTO_INCREMENT');
        });
    }
    

答案 1 :(得分:1)

你的主键毫无意义。

您正在向自动递增列和另一列添加复合主键。自动递增列将始终是唯一的,因此您应该只将它作为主键。

如果您需要pid是唯一的,请将rid设置为主键,并在pid上添加唯一键。

Schema::create('spins', function (Blueprint $table) {
    $table->increments('rid');
    $table->bigInteger('pid');
    $table->integer('result');
    $table->integer('bet');
    $table->timestamps();
    $table->unique('pid');
});

如果出于某种原因,您确实需要主键包含ridpid,这似乎对我有用。

CREATE TABLE `spins` (
  `rid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `pid` BIGINT(20) NOT NULL,
  `result` INT(11) NOT NULL,
  `bet` INT(11) NOT NULL,
  `created_at` TIMESTAMP NOT NULL,
  `updated_at` TIMESTAMP NOT NULL,
  PRIMARY KEY (`rid`, `pid`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

答案 2 :(得分:0)

您无法在一张桌子上拥有多个主键。您可以拥有复合主键,该主键是由两列或更多列组成的主键。显然Blueprint does not support creating composite keys,如果您想使用复合键,则必须使用查询构建器。

否则,您只需选择pidrid作为主键。