2015-12-10 9 views
14

ユーザーテーブルで1000から自分のIDを開始する必要がありますが、これに対してどのようにしてマイグレーションを作成できますか?マイグレーション中に自動インクリメントフィールド開始フォーム1000を設定するlaravel 5.1

私の現在の移行がある:それは(テストしていません)このようにする必要があり

public function up() 
{ 
    Schema::create('users', function (Blueprint $table) { 
     $table->increments('id'); // how can I start this from 1000 
     $table->integer('qualification_id')->nullable(); 
     $table->integer('experience_id')->nullable(); 
    }); 
} 

答えて

12

use Illuminate\Database\Migrations\Migration; 
use Illuminate\Support\Facades\DB; 

class MyTableMigration extends Migration { 

    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
    public function up() 
    { 
     $statement = "ALTER TABLE MY_TABLE AUTO_INCREMENT = 111111;"; 
     DB::unprepared($statement); 
    } 

    /** 
    * Reverse the migrations. 
    * 
    * @return void 
    */ 
    public function down() 
    { 
    } 
} 

更新

//Your migrations here: 
Schema::create('users', function (Blueprint $table) { 
    $table->bigIncrements('id')->unsigned(); 
    $table->integer('qualification_id')->nullable(); 
    $table->integer('experience_id')->nullable(); 
}); 

//then set autoincrement to 1000 
DB::update("ALTER TABLE users AUTO_INCREMENT = 1000;"); 
+0

私はマイグレーションの下でその行を貼り付けたので、エラーを出力します: '非複合名 'DB'を使用するステートメントは効果がありません。 –

+1

DBを使用していますなぜこのエラーが発生しているのですか?これを削除してください。 –

+0

これはすべてのデータベースで機能しません。例、sqliteでは動作しません。 – abkrim

-3

のPrashantの方法は問題なく動作します。 しかし先に述べたように、ファイルの先頭にuse DB;を入れないでください。

enter image description here

そしてここでの結果はphp artisan migrate

And here are the results

+1

あなたの答えをありがとう、しかし私はあなたがPrashantと同じ答えを投稿したと思います。 –

+0

同じです。すべてのデータベースタイプでは機能しません。 – abkrim

+0

あなたの答えと推測を詳細に記述してください。 –

6

後、ほとんどのテーブルは、次の最大の整数からインクリメント刻みで動作しています。

常に現在の自動インクリメントインデックスよりも高い整数を挿入できます。オートインクリメントのインデックスは自動的にその新しい値+1から続きます。

あなたがたて鋳造テーブルを持っている場合は、あなたの現在のインデックスが0であるので、次のキーは、我々が望むものを0 + 1 = 1

になりますと、1000年から始まり、主キーであるので、我々は何をすべきか999のID値を持つレコードを挿入しているので、次のインサートは、コードでは1000

になります:

$startId = 1000; 

DB::table('users')->insert(['id'=> $startId - 1]); 
DB::table('users')->where('id',$startId - 1)->delete(); 

、今あなたは、次のインサートIDが1000

である必要があり、空のテーブルを持っています

ID値が< startIdのテーブルにシードする値がある場合は、の前にを実行する必要があります。そうしないと、データベースは制約違反エラーをスローします。

これはデータベースに依存しませんが、この自動インクリメントルールに従わないデータベースがあると、それについて聞きたいと思います。

+1

その良いトリック:) –

+0

はい、データベース固有のハッキングの代わりに、どのデータベースエンジンでも使用可能なデータベースにとらわれない回答を投稿することに決めました。 – Tschallacka

0

の移行は、テーブルを作成し、必要な任意の単一のSQL文を実行するために使用することができ

public function up() 
{ 
    Schema::create('users', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->integer('qualification_id')->nullable(); 
     $table->integer('experience_id')->nullable(); 
    }); 

    // Here's the magic 
    \DB::statement('ALTER TABLE table_name AUTO_INCREMENT = 1000;'); 
} 

DB::statement()

Laravel 5.5のように、その自動インクリメント値を設定します。

関連する問題