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

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

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

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

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


## 環境
Laravel 9.52.16

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

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

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

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

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

```php: 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(),
            ]);
        }

    }
}

```

```terminal: ターミナル
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文を使う

```php: 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からスタートするようになりました。


```terminal: ターミナル
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からスタートしていることが確認できますね！