質問: 以下のテーブルを作り ``` CREATE TABLE IF NOT EXISTS users( user_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, user_name VARCHAR(30) NOT NULL ); ``` 以下の情報を追加しました。もちろん、auto_incrementをつけてるので問題なく1~4のidがuser_idカラムに追加されましたが、 ``` INSERT INTO users(user_name) VALUES('name01'); INSERT INTO users(user_name) VALUES('name02'); INSERT INTO users(user_name) VALUES('name03'); INSERT INTO users(user_name) VALUES('name04'); ``` ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/8e6d1f1f75c0376c4cd75f405e884772.png) 例えば、name04を消し、 ``` DELETE FROM users WHERE user_id=4; ``` 新たに情報を追加したときに、 ``` INSERT INTO users(user_name) VALUES('name05'); ``` 結果がuser_idに4追加されたと思いきや、5になってしまってます。 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/e4eddea252e1bc613463c1eb77245ce2.png) ○質問 上記のようにuser_idの情報が5にとぶのはなぜなのか、また解決策があれば、ご教授お願いします。 ※idが5にとぶのではなく、最初みたいに1,2,3,4みたいに割り当てて欲しいです。
回答: > > 上記のようにuser_idの情報が5にとぶのはなぜなのか > > > それがauto_incrementの仕様だからです。 auto_incrementは現時点のデータとは別に、次に追加されるIDを記憶しています。 参考 なぜそういう実装になっているかの歴史的経緯は知りませんが、 例えばuser_idの場合、削除して次に挿入したら同じIDになると問題が出る可能性があります。 例えば別のテーブルで、user_idと紐づける形で住所を保存していたりした場合、他人のデータと結びつくことになってしまう可能性があります。 > > また解決策があれば、ご教授お願いします。 > > > Auto_incrementの値は指定することが可能 ですが、これを日常的に使うくらいなら、 auto_incrementを指定せずに、 テーブルの中で一番大きなIDの値を取得して、それに1を足して指定するべきIDを生成してデータを挿入する という形にするのが一般的な方法かと思います。