質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.61%

  • MySQL

    5694questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

データベース設計 IDのインクリメント

受付中

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 851
退会済みユーザー

退会済みユーザー

データベースでuserテーブルを作った時などIDをつけて、auto incrementにすると思います。

ですが、ユーザの削除などで使われないIDが出てくると思います。つまり1,2,3,4,5とユーザーがいて、3のユーザが削除されると、1,2,4,5となると思います。

この場合、4のユーザを3へ、5のユーザを4へなど変更しないのが普通なのでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

+5

たとえは、この teratail で考えてみましょうか。

id : 10001
user: sumsum25

というデータが user テーブルにあるとします。(おそらくあるはずですね)

この質問の投稿を管理しているテーブル(とりあえず post としましょう)も当然あるはずです。
この投稿が、誰によって作られたものかがわかるように、user_id も持つはず。

id: 16297
user_id: 10001
title: データベース設計 IDのインクリメント
content: データベースでuserテーブルを作った時などIDをつけて、auto incrementにすると思います。...

この投稿をしたユーザー(ここではあなた)が退会したと言って、他の人が、10001番になったら、この投稿は誰がしたことになりますか?

おかしなことになってしまいますね。無理に整合性を保つとなれば、投稿だけじゃなくて、フォローのデータとか色々変更しなくてはいけなくなります。

この場合、4のユーザを3へ、5のユーザを4へなど変更しないのが普通なのでしょうか? 

だから、変更しないのが普通というより、事実上「絶対してはいけない」ことなのです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

IDを外部キーに持っているテーブル全てに変更が必要になります。また、IDは連番である意味は全くないので変更するメリットがほぼありません。

しないのが普通というよりも、困難な上メリットがそんなにないためやらないという方が正確かもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

主キーは変更しないのが普通です。

理由は、リレーションに関係なく、変更するメリットがないからです。

例えば、userテーブルのみしか扱わないアプリを想定してください。
別のアプリ参照は無い(どこかでリレーションする可能性がない)とします。

この状態で、ユーザーを削除した時に、
・歯抜けのIDを整列させて、
・インデックスを調整する
という対応(実装)する手間に必要性を感じますでしょうか?

まあ、それが質問なのでしょうが、必要になるケースは無いです。

ちなみに蛇足ですが、
userテーブルをauto incrementしている主キーでリレーションしてると、
あるタイミングでDelete-Insertの総入れ替えをした際にコケます。
DBの知識が高い人からすれば笑わってしまわれる運用かもですが、
現場では、こういう対応が起こります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

データベース関連でやりがちなミスを集めたSQLアンチパターンという本がありますが、その21章に「シュードキー・ニートフリーク(疑似キー潔癖症)」という、ちょうどこの話題を取り上げたものがあります。

IDはデータベース管理用の値なので、詰める必然性もありませんし、それどころかRDBMSによっては、一意性を確保するために、「番号は生成したけど使われない」ということすら起きえます。

なお、どうしても飛びのない連番を振りたい場合は、IDとは別途で用意した方がいいでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

既に皆様がご回答なさっている通りで、不可能ではないかもしれないけれども、敢えて実施する事は希だと思います。こちら にも同類の回答が多数寄せられています。

身近な例で言えば、学生の出席番号(学籍番号)でも同じですよね?
誰かが転校して欠番が生じても詰めたりしません。
なぜかと言えば、過去の履歴の管理が面倒になるからです。

例えばA君が在籍していた1学期までの成績の記録と転向した2学期以降の記録で学籍番号がズレているとどうなるでしょうか・・・

ちなみに、話は逸れますが、auto increment を使用すること自体、注意が必要なようです。(ご参考

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • MySQL

    5694questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。