3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

オートインクリメント値を0にリセットしたい!

Posted at

はじめに

Seederで作成したテストデータを消去して「php artisan migrate:fresh --seed」もう一度作成すると、

レコードの主キーのidが「5」からスタートしていました。

自分としては作り直しても主キーを0からスタートする方法を探していたので、対処法をまとめます。

結論としては、任意のSeederクラス内に「DB:statement()」を追記することで、オートインクリメント値をリセットできます。

環境

Laravel 9.52.16

問題

  • Seederでテストデータを作成したい
  • 作り直すごとに自動インクリメントのidが1からスタートするようにしたい

自動インクリメントはMySQLなどのデータベースシステムで使用される特性で、

主キーのフィールドに値を自動的に生成して割り当てます。

例えば主キーが「id」カラムの時、MySQLはこちらが指示を出さずとも自動的に1から順番の値を割り当ててくれます。

しかしテーブルデータを一旦削除し、新しくSeederでデータを挿入しようとすると、主キーが途中の数字から割り当てられてしまいます。

CategoriesTableSeeder.php
<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class CategoriesTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        // categoriesテーブルのデータを一旦削除する
        DB::table('categories')->delete(); 

        // categoriesテーブルのテストデータを作成
        $categories = ['ゲーム', '料理', 'スポーツ', '音楽', 'その他'];

        foreach ($categories as $category) {
            DB::table('categories')->insert([
                'category' => $category,
                'created_at' => now(),
                'updated_at' => now(),
            ]);
        }

    }
}

ターミナル
root:/var/www/html/niches# php artisan migrate:fresh --seed
root:/var/www/html/niches# php artisan tinker

Deprecated: PHP Startup: Use of mbstring.internal_encoding is deprecated in Unknown on line 0
Psy Shell v0.11.22 (PHP 8.2.7 — cli) by Justin Hileman
> use Category
> Category::all();
[!] Aliasing 'Category' to 'App\Models\Category' for this Tinker session.
= Illuminate\Database\Eloquent\Collection {#7248
    all: [
      App\Models\Category {#7250
        id: 6, 
        category: "ゲーム",
      },
      App\Models\Category {#7251
        id: 7,
        category: "料理",
      },
      App\Models\Category {#7252
        id: 8,
        category: "スポーツ",
      },
      App\Models\Category {#7253
        id: 9,
        category: "音楽",
      },
      App\Models\Category {#7254
        id: 10,
        category: "その他",
      },
    ],
  }

解決法

  • 「DB:statement」でオートインクリメント値をリセットするSQL文を使う
CategoriesTableSeeder.php
<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class CategoriesTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table('categories')->delete(); 

        // categoriesテーブルのオートインクリメント値をリセット
        DB::statement('ALTER TABLE categories AUTO_INCREMENT = 1');

        $categories = ['ゲーム', '料理', 'スポーツ', '音楽', 'その他'];

        foreach ($categories as $category) {
            DB::table('categories')->insert([
                'category' => $category,
                'created_at' => now(),
                'updated_at' => now(),
            ]);
        }

    }
}

LaravelのDB:statementメソッドを使い、生のSQL文を実行します。

具体的には、「categoriesテーブルのAUTO_INCREMENT値を1にリセットする」SQL文を実行しています。

これにより、Seederを実行して再度データを生成する際、

AUTO_INCREMENT値が1からスタートするようになりました。

ターミナル
root:/var/www/html/niches# php artisan migrate:fresh --seed
root:/var/www/html/niches# php artisan tinker

Deprecated: PHP Startup: Use of mbstring.internal_encoding is deprecated in Unknown on line 0
Psy Shell v0.11.22 (PHP 8.2.7 — cli) by Justin Hileman
> use Category
> Category::all();
[!] Aliasing 'Category' to 'App\Models\Category' for this Tinker session.
= Illuminate\Database\Eloquent\Collection {#7248
    all: [
      App\Models\Category {#7250
        id: 1, 
        category: "ゲーム",
      },
      App\Models\Category {#7251
        id: 2,
        category: "料理",
      },
      App\Models\Category {#7252
        id: 3,
        category: "スポーツ",
      },
      App\Models\Category {#7253
        id: 4,
        category: "音楽",
      },
      App\Models\Category {#7254
        id: 5,
        category: "その他",
      },
    ],
  }

ちゃんと主キーのidが1からスタートしていることが確認できますね!

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?