2016-01-19 177 views
3

我想在Laravel中創建一個遷移,但它失敗說我有多個主鍵。Laravel遷移失敗多個主鍵

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`))  

回答

2

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');


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'); 
    }); 
} 
+0

這似乎工作。非常感謝,我可以接受它作爲答案。 – Maantje

0

你的主鍵是沒有意義的。

您正在將複合主鍵添加到自動遞增列和另一列。自動遞增列將始終是唯一的,因此您應該只將它作爲主鍵。

如果您需要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; 
0

在單個表上不能有多個主鍵。您可以有一個組合主鍵,它是由兩列或更多列組成的主鍵。顯然Blueprint does not support creating composite keys,所以如果你想使用組合鍵,你必須使用查詢生成器。

否則,您可以選擇pidrid作爲您的主鍵。

+1

'Blueprint'不支持複合主鍵,你不能讓這些鍵之一自動遞增。我通常使用'Blueprint'在數據透視表上執行復合主鍵,它工作正常。 – user3158900

+0

@ user3158900嗯,這是壞它不能自動增量:/虐待必須嘗試另一種方式然後 – Maantje

+1

如果你真的需要這個主鍵,可能通過查詢生成器,並可以通過原始SQL。 – user3158900