teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

AUTO_INCREMENTについて説明追加

2017/11/16 16:49

投稿

tanat
tanat

スコア18778

answer CHANGED
@@ -1,6 +1,11 @@
1
1
  勝手にIDが増えていくのはIDフィールドに[AUTO_INCREMENT属性](https://dev.mysql.com/doc/refman/5.6/ja/example-auto-increment.html)
2
2
  が付与されているからと思われます。
3
3
 
4
+ AUTO_INCREMENT属性がついているIDの場合、テーブル自体に次に振られるべきIDが記録されており、insertされる度に1増えていき、レコードが削除されても減ることはありません。
5
+
6
+ なのでたとえば、
7
+ 3件追加→3件削除→1件追加 とした場合、テーブルに残るのはID4のレコードになります。
8
+
4
9
  よくある解決方法としては、
5
10
  0. IDに欠番が発生することを気にしない
6
11
  下手にIDを再利用すると色々面倒なこと(例えば、このIDを他のテーブルでのデータ連結に使用している場合)が起こる可能性が増えるので、IDに欠番が発生しても気にしないという方法はよくあります。(個人的には特に理由がない限りは一番お勧めです)

1

締めを追記

2017/11/16 16:49

投稿

tanat
tanat

スコア18778

answer CHANGED
@@ -7,4 +7,7 @@
7
7
  0. 論理削除する。
8
8
  例えば、is_deleteフィールドを設けて、削除したことにしたいレコードについてis_deleteフィールドに1を入れてupdateする。といった方法です。これは今回考えられている方法に近いと思います。これもよくある実装かと思います。
9
9
  0. 自力でIDを採番する
10
- insertするタイミングで空いているIDを自力で探して、IDを指定してinsertします。1番目のお勧め理由によって個人的には嫌いな方法です。
10
+ deleteは現状のまま行い、insertするタイミングで空いているIDを自力で探して、IDを指定してinsertします。1番目のお勧め理由によって個人的には嫌いな方法です。
11
+ 0. deleteしたタイミングでIDを詰める。途中のIDを削除した場合に、それより後ろのIDをすべて-1してupdateします。普通はやらないです。
12
+
13
+ あたりかなと思います。