我正在尝试在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`))
答案 0 :(得分:6)
rid
的自动增量是问题(下面一行中的第二个参数)。
$table->integer('rid', true, true);
如果您使用InnoDB作为MySQL引擎,它不允许复合主键具有自动增量。
但如果您更改为MyISAM引擎,则可以这样做。
将$table->engine = 'MyISAM';
添加到您的迁移。
将rid
字段声明为普通整数列
Laravel没有提供更改现有列的方法,因此您需要运行原始SQL查询:DB::statement('ALTER TABLE spins MODIFY rid INTEGER NOT NULL AUTO_INCREMENT');
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');
});
如果出于某种原因,您确实需要主键包含rid
和pid
,这似乎对我有用。
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,如果您想使用复合键,则必须使用查询构建器。
否则,您只需选择pid
或rid
作为主键。