Legen Sie den Start des Auto-Increment-Felds bei 1000 in Migration Laravel 5.1 fest

Lesezeit: 4 Minuten

Benutzer-Avatar
Anshul Mishra

Ich muss meine IDs von 1000 in der Benutzertabelle starten, wie könnte ich dafür eine Migration erstellen.

Meine aktuelle Migration ist:

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();
    });
}

  • Für Laravel 8+ gibt es eine neuer Modifikator du kannst sowas machen $table->id()->from(1000); Ich verstehe diese Frage für 5.1

    – Salam

    30. September 2020 um 15:32 Uhr

So sollte es sein (nicht getestet).

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()
    {
    }
}

Aktualisieren

//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
//after creating the table
DB::update("ALTER TABLE users AUTO_INCREMENT = 1000;");

  • Ich habe diese Zeile unter meiner Migration eingefügt, es wurde ein Fehler ausgegeben: The use statement with non-compound name 'DB' has no effect

    – Anshul Mishra

    10. Dezember 2015 um 7:47 Uhr

  • Ich denke, Sie verwenden DB oben (verwenden Sie DB;). Deshalb erhalten Sie diesen Fehler. Entfernen Sie ihn einfach, und ich habe meine Antwort aktualisiert.

    Benutzer5456506

    10. Dezember 2015 um 8:12 Uhr

  • Dies funktioniert nicht für alle Datenbanken. Beispiel, funktioniert nicht für sqlite.

    – Abkrim

    23. November 2016 um 17:35 Uhr

  • Wenn Sie dies in einer SQLite-Datenbank verwenden möchten, verwenden Sie DB::update("UPDATE SQLITE_SEQUENCE SET seq = $num WHERE name = '$table'") wobei $num Ihre neue letzte Inkrementnummer und $table die Tabelle ist. sqlite.org/autoinc.html

    – Abkrim

    23. November 2016 um 17:49 Uhr


In Laravel 8 können Sie verwenden from() nur für MySQL / PostgreSQL:

Legen Sie den Startwert eines automatisch inkrementierenden Felds fest (MySQL/PostgreSQL)

$table->id()->from(...);

Dies startingValue() -Methode funktioniert auch, aber ich habe dies nirgendwo in der Dokumentation erwähnt.

$table->id()->startingValue(...);

Unter der Haube für mysql verwendet es:

public function compileAutoIncrementStartingValues(Blueprint $blueprint)
{
    return collect($blueprint->autoIncrementingStartingValues())->map(function ($value, $column) use ($blueprint) {
        return 'alter table '.$this->wrapTable($blueprint->getTable()).' auto_increment=".$value;
    })->all();
}

  • $table->id()->from(1000); fügt die Daten-ID ab 1000 ein

    – Mohammed Raza

    18. März um 18:23 Uhr

Migration zum Erstellen einer Tabelle und Festlegen des Autoinkrementwerts ab Laravel 5.5

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() kann verwendet werden, um jede einzelne SQL-Anweisung auszuführen, die Sie benötigen.

  • Was ist, wenn ich viele Spalten mit inkrementiertem Datentyp in derselben Tabelle habe, zum Beispiel product_id, counter_id, und ich nur den Startwert für counter_id festlegen möchte, wirkt sich dies auch auf product_id aus?

    – Hussam Adil

    4. September 2019 um 11:33 Uhr

  • Der Zähler wird auf Tabellenebene definiert. Sie können in MySQL nicht mehrere AUTO_INCREMENT-Spalten in einer Tabelle haben, daher ist das, was Sie fragen, nicht möglich.

    – Kapitän Hypertext

    4. September 2019 um 11:47 Uhr


Benutzer-Avatar
Tschallacka

Die meisten Tabellen arbeiten mit Inkrementen, die von der nächstgrößten ganzen Zahl aus inkrementiert werden.

Man kann immer eine Ganzzahl einfügen, die höher ist als der aktuelle Autoincrementing-Index. Der automatisch inkrementierende Index folgt dann automatisch ab diesem neuen Wert +1 aufwärts.

Wenn Sie also eine frisch erstellte Tabelle haben, ist Ihr aktueller Index 0, der nächste Schlüssel ist 0 + 1 = 1.

Was wir wollen, ist ein Primärschlüssel, der bei 1000 beginnt, also fügen wir einen Datensatz mit dem ID-Wert 999 ein, sodass die nächste Einfügung 1000 wird.

In Code:

 $startId = 1000;

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

und jetzt haben Sie eine leere Tabelle, in der die nächste Insert-ID 1000 sein sollte.

Bitte beachten Sie, dass, wenn Sie Werte in die Tabelle mit ID-Werten < startId das musst du machen Vor Sie führen diese Anweisungen aus. Andernfalls gibt die Datenbank einen Constraint-Violation-Fehler aus.

Dies sollte datenbankunabhängig funktionieren, aber wenn es eine Datenbank gibt, die dieser Autoincrement-Regel nicht folgt, würde ich gerne davon hören.

Benutzer-Avatar
Knall T

//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

 //after creating the table

 DB::update("ALTER TABLE users AUTO_INCREMENT = 1000;");

Wir müssen eine Präfixtabelle hinzufügen. Also müssen wir die Leitung ersetzen

DB::update("ALTER TABLE users AUTO_INCREMENT = 1000;");

um 2 Zeilen darunter:

$prefix = DB::getTablePrefix();
DB::update("ALTER TABLE ".$prefix."users AUTO_INCREMENT = 1000;");

  • Vielen Dank. In Laravel 8 können Sie direkt $table->id()->from(1000);

    – Ahsan Khan

    23. September 2021 um 7:23 Uhr

Benutzer-Avatar
Szabi Zsoldos

Die Methode von Prashant funktioniert ohne Probleme. Aber wie gesagt, nicht setzen use DB; oben in Ihrer Datei.

Geben Sie hier die Bildbeschreibung ein

Und hier sind die Ergebnisse danach php artisan migrate

Und hier sind die Ergebnisse

  • Vielen Dank. In Laravel 8 können Sie direkt $table->id()->from(1000);

    – Ahsan Khan

    23. September 2021 um 7:23 Uhr

1175750cookie-checkLegen Sie den Start des Auto-Increment-Felds bei 1000 in Migration Laravel 5.1 fest

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy