SlideShare a Scribd company logo
1 of 32
メッチャ役に立つ
auto_incrementの話

    @kitakoh 2012
自己紹介

@kitakoh(放置中…)

大分から来ました

パン食べるパン

よろしくお願いします!
auto_increment



通し番号を自動で振ってくれる機能
user_id(auto_increment),
user_name(char 10)

だけのテーブルで実験
普通にINSERT

INSERT INTO tbl (user_name)
VALUES
(‘user01’),
(‘user02’),
(‘user03’);
普通にINSERT
 +---------+-----------+
 | user_id | user_name |
 +---------+-----------+
 |       1 | user01    |
 |       2 | user02    |
 |       3 | user03    |
 +---------+-----------+
3 rows in set (0.00 sec)
user_id=2をDELETE
   +---------+-----------+
   | user_id | user_name |
   +---------+-----------+
   |       1 | user01    |
   |     ! 2 | user02    |
   |       3 | user03    |
   +---------+-----------+
  3 rows in set (0.00 sec)
この状態で新規行をINSERT
    +---------+-----------+
    | user_id | user_name |
    +---------+-----------+
    |       1 | user01    |
    |       3 | user03    |
    +---------+-----------+
   2 rows in set (0.00 sec)
最後に追加された
 +---------+-----------+
 | user_id | user_name |
 +---------+-----------+
 |       1 | user01    |
 |       3 | user03    |
 |     ! 4 | userXX    |
 +---------+-----------+
3 rows in set (0.00 sec)
最後の行をDELETEしてINSERTすると?
     +---------+-----------+
     | user_id | user_name |
     +---------+-----------+
     |       1 | user01    |
     |       3 | user03    |
     |     ! 4 | userXX    |
     +---------+-----------+
    3 rows in set (0.00 sec)
最後に追加された
 +---------+-----------+
 | user_id | user_name |
 +---------+-----------+
 |       1 | user01    |
 |       3 | user03    |
 |     ! 5 | userYY    |
 +---------+-----------+
3 rows in set (0.00 sec)
auto_incrementで振られ
るシーケンスは再利用され
       ない
user_idを指定してみる


INSERT INTO tbl (user_id, user_name)
VALUES (10, ‘user10’);
ここに新規行をINSERT
  +---------+-----------+
  | user_id | user_name |
  +---------+-----------+
  |       1 | user01    |
  |       3 | user03    |
  |       4 | userXX    |
  |       5 | userYY    |
  |      10 | user10    |
  +---------+-----------+
最後に追加された
+---------+-----------+
| user_id | user_name |
+---------+-----------+
|       1 | user01    |
|       3 | user03    |
|       4 | userXX    |
|       5 | userYY    |
|      10 | user10    |
|    ! 11 | userZZ    |
+---------+-----------+
歯抜けのuser_idを指定


INSERT INTO tbl (user_id, user_name)
VALUES (2, ‘user2’);
指定場所に追加される
 +---------+-----------+
 | user_id | user_name |
 +---------+-----------+
 |       1 | user01    |
 |     ! 2 | user02    |
 |       3 | user03    |
 |       4 | userXX    |
 |       5 | userYY    |
 |      10 | user10    |
 |      11 | userZZ    |
シーケンスは基本的に再利
用されないが、値を指定す
  れば再利用可能
全行DELETEするとどうなる?

(シーケンス11まで振られている状態で)
DELETE FROM tbl;

INSERT INTO tbl(user_name)
VALUES(‘userXX’);
最後に追加される
 +---------+-----------+
 | user_id | user_name |
 +---------+-----------+
 |      12 | userXX    |
 +---------+-----------+
1 rows in set (0.00 sec)
テーブルをTRUNCATEするとどうなる?


(シーケンスが12まで振られてる状態で)
TRUNCATE TABLE tbl;

INSERT INTO
tbl(user_name)VALUES(‘userXX’);
シーケンスが巻き戻った
  +---------+-----------+
  | user_id | user_name |
  +---------+-----------+
  |       1 | userXX    |
  +---------+-----------+
 1 rows in set (0.00 sec)

        ※MySQL5.5
DELETEでは巻き戻らないが、
 TRUNCATEだと巻き戻る
user_idが最大値の状態でINSERT

INSERT INTO tbl(user_id, user_name)
VALUES(127, ‘userXX’);

        +---------+-----------+
        | user_id | user_name |
        +---------+-----------+
        |     127 | userXX    |
        +---------+-----------+
           ↑TINYINT(SIGNED)
ERRORになる


ERROR 1062 (23000): Duplicate entry
'127' for key 'PRIMARY'
シーケンス値は、ALTER文で指定できる




ALTER TABLE tbl auto_increment = 10;

10に指定しているので、新規行INSERTすると11から
入る
今のシーケンス値を知る方法
  SHOW CREATE TABLE tbl;

+-------+------------------------------------------------+
| Table | Create Table                                   |
+-------+------------------------------------------------+
| tbl   | CREATE TABLE `tbl` (                           |
|       | `user_id` tinyint(4) NOT NULL AUTO_INCREMENT, |
|       | `user_name` char(10) DEFAULT NULL,             |
|       | PRIMARY KEY (`user_id`)                        |
|       | ) ENGINE=InnoDB AUTO_INCREMENT=10              |
+-------+------------------------------------------------+
複合キーでauto_increment


CREATE TABLE tbl(
    dept_id TINYINT,   ←部門IDを追加
    user_id TINYINT AUTO_INCREMENT,
    user_name CHAR(10),
    PRIMARY KEY(dept_id, user_id)
)ENGINE=MyISAM;
複合キーでauto_increment

insert into tbl(dept_id, user_name) values(1, 'aa');
insert into tbl(dept_id, user_name) values(1, 'bb');
insert into tbl(dept_id, user_name) values(1, 'cc');

insert into tbl(dept_id, user_name) values(2, 'aa');
insert into tbl(dept_id, user_name) values(2, 'bb');
insert into tbl(dept_id, user_name) values(2, 'cc');

1と2の部門に3件ずつINSERTしてみる
複合キーでauto_increment

 +---------+---------+-----------+
 | dept_id | user_id | user_name |
 +---------+---------+-----------+
 |       1 |       1 | aa        |
 |       1 |       2 | bb        |
 |       1 |       3 | cc        |
 |       2 |       1 | aa        |
 |       2 |       2 | bb        |
 |       2 |       3 | cc        |
 +---------+---------+-----------+
 6 rows in set (0.01 sec)
複合キーでauto_increment

 dept_idとuser_idで重
 複しないように、自動的に
 user_idを連番で振ってく
 れます。(MyISAM限定)
メッチャ役に立つauto_incrementの話




        完 ご清聴下さった皆様、
      場所をご提供下さいましたgumi様、
         ありがとうございました

More Related Content

What's hot

ピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築するピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
Takahito Tejima
 
ぼくとJenkinsおじさんの360日戦争
ぼくとJenkinsおじさんの360日戦争ぼくとJenkinsおじさんの360日戦争
ぼくとJenkinsおじさんの360日戦争
goccy
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知る
Shuhei Fujita
 

What's hot (20)

モンスターストライクにおける負荷対策
モンスターストライクにおける負荷対策モンスターストライクにおける負荷対策
モンスターストライクにおける負荷対策
 
オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫
 
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築するピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
 
ミクシィ 21卒向け Android研修
ミクシィ 21卒向け Android研修ミクシィ 21卒向け Android研修
ミクシィ 21卒向け Android研修
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
 
組み込みLinuxでのGolangのススメ
組み込みLinuxでのGolangのススメ組み込みLinuxでのGolangのススメ
組み込みLinuxでのGolangのススメ
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
 
nginx入門
nginx入門nginx入門
nginx入門
 
ゲームの仕様書を書こうまとめ
ゲームの仕様書を書こうまとめゲームの仕様書を書こうまとめ
ゲームの仕様書を書こうまとめ
 
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
 
ぼくとJenkinsおじさんの360日戦争
ぼくとJenkinsおじさんの360日戦争ぼくとJenkinsおじさんの360日戦争
ぼくとJenkinsおじさんの360日戦争
 
使ってみませんか?pg_hint_plan
使ってみませんか?pg_hint_plan使ってみませんか?pg_hint_plan
使ってみませんか?pg_hint_plan
 
Firebase A/B Testingを使ってサーバ側までA/Bテストした話(Android)
Firebase A/B Testingを使ってサーバ側までA/Bテストした話(Android)Firebase A/B Testingを使ってサーバ側までA/Bテストした話(Android)
Firebase A/B Testingを使ってサーバ側までA/Bテストした話(Android)
 
OpenAI の音声認識 AI「Whisper」をテストしてみた
OpenAI の音声認識 AI「Whisper」をテストしてみたOpenAI の音声認識 AI「Whisper」をテストしてみた
OpenAI の音声認識 AI「Whisper」をテストしてみた
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知る
 
Unityではじめるオープンワールド制作 エンジニア編
Unityではじめるオープンワールド制作 エンジニア編Unityではじめるオープンワールド制作 エンジニア編
Unityではじめるオープンワールド制作 エンジニア編
 
WebSocketでカメラの映像を共有してみた
WebSocketでカメラの映像を共有してみたWebSocketでカメラの映像を共有してみた
WebSocketでカメラの映像を共有してみた
 
最適化超入門
最適化超入門最適化超入門
最適化超入門
 
人工知能は人狼の夢を見るか-日本デジタルゲーム学会年次大会2013@函館
人工知能は人狼の夢を見るか-日本デジタルゲーム学会年次大会2013@函館人工知能は人狼の夢を見るか-日本デジタルゲーム学会年次大会2013@函館
人工知能は人狼の夢を見るか-日本デジタルゲーム学会年次大会2013@函館
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 

Viewers also liked

私がMySQLを始めた理由
私がMySQLを始めた理由私がMySQLを始めた理由
私がMySQLを始めた理由
yoyamasaki
 
My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1
Makoto Haruyama
 
MySQL for Excelの紹介
MySQL for Excelの紹介MySQL for Excelの紹介
MySQL for Excelの紹介
yoyamasaki
 
カジュアルにギャップキーロックとネクストキーロック
カジュアルにギャップキーロックとネクストキーロックカジュアルにギャップキーロックとネクストキーロック
カジュアルにギャップキーロックとネクストキーロック
株式会社シャーロック
 
MySQL Casual Talks in Fukuoka vol.2
MySQL Casual Talks in Fukuoka vol.2MySQL Casual Talks in Fukuoka vol.2
MySQL Casual Talks in Fukuoka vol.2
学 松崎
 
Mysql casual fukuoa_vlo_2
Mysql casual fukuoa_vlo_2Mysql casual fukuoa_vlo_2
Mysql casual fukuoa_vlo_2
Makoto Haruyama
 
DB技術[実践]入門を読んだ
DB技術[実践]入門を読んだDB技術[実践]入門を読んだ
DB技術[実践]入門を読んだ
Yuuki Tan-nai
 
Chef の気まぐれ環境構築 〜季節の Capistrano を添えて〜 #jawsug
Chef の気まぐれ環境構築 〜季節の Capistrano を添えて〜 #jawsugChef の気まぐれ環境構築 〜季節の Capistrano を添えて〜 #jawsug
Chef の気まぐれ環境構築 〜季節の Capistrano を添えて〜 #jawsug
Takeshi Komiya
 

Viewers also liked (20)

私がMySQLを始めた理由
私がMySQLを始めた理由私がMySQLを始めた理由
私がMySQLを始めた理由
 
カジュアルにバックアップ - MySQL Casual Talks 福岡
カジュアルにバックアップ - MySQL Casual Talks 福岡カジュアルにバックアップ - MySQL Casual Talks 福岡
カジュアルにバックアップ - MySQL Casual Talks 福岡
 
My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1
 
Mysql casial01
Mysql casial01Mysql casial01
Mysql casial01
 
MySQL de NoSQL Fukuoka
MySQL de NoSQL FukuokaMySQL de NoSQL Fukuoka
MySQL de NoSQL Fukuoka
 
MySQL for Excelの紹介
MySQL for Excelの紹介MySQL for Excelの紹介
MySQL for Excelの紹介
 
カジュアルにギャップキーロックとネクストキーロック
カジュアルにギャップキーロックとネクストキーロックカジュアルにギャップキーロックとネクストキーロック
カジュアルにギャップキーロックとネクストキーロック
 
MySQL Casual Talks in Fukuoka vol.2
MySQL Casual Talks in Fukuoka vol.2MySQL Casual Talks in Fukuoka vol.2
MySQL Casual Talks in Fukuoka vol.2
 
Mysql casual fukuoa_vlo_2
Mysql casual fukuoa_vlo_2Mysql casual fukuoa_vlo_2
Mysql casual fukuoa_vlo_2
 
なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?
 
Blazing Performance with Flame Graphs
Blazing Performance with Flame GraphsBlazing Performance with Flame Graphs
Blazing Performance with Flame Graphs
 
DevOps Practices: Configuration as Code
DevOps Practices:Configuration as CodeDevOps Practices:Configuration as Code
DevOps Practices: Configuration as Code
 
Configuration As Code - Adoption of the Job DSL Plugin at Netflix
Configuration As Code - Adoption of the Job DSL Plugin at NetflixConfiguration As Code - Adoption of the Job DSL Plugin at Netflix
Configuration As Code - Adoption of the Job DSL Plugin at Netflix
 
深い親子関係のテーブル設計
深い親子関係のテーブル設計深い親子関係のテーブル設計
深い親子関係のテーブル設計
 
DB技術[実践]入門を読んだ
DB技術[実践]入門を読んだDB技術[実践]入門を読んだ
DB技術[実践]入門を読んだ
 
MySQL カジュアル 福岡 03
MySQL カジュアル 福岡 03MySQL カジュアル 福岡 03
MySQL カジュアル 福岡 03
 
Chef の気まぐれ環境構築 〜季節の Capistrano を添えて〜 #jawsug
Chef の気まぐれ環境構築 〜季節の Capistrano を添えて〜 #jawsugChef の気まぐれ環境構築 〜季節の Capistrano を添えて〜 #jawsug
Chef の気まぐれ環境構築 〜季節の Capistrano を添えて〜 #jawsug
 
ドキュメントの話、しませんか? #428rk01
ドキュメントの話、しませんか? #428rk01ドキュメントの話、しませんか? #428rk01
ドキュメントの話、しませんか? #428rk01
 
外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話
 
PayPal Big Data and MySQL Cluster
PayPal Big Data and MySQL ClusterPayPal Big Data and MySQL Cluster
PayPal Big Data and MySQL Cluster
 

Similar to メッチャ役に立つauto_incrementの話 (9)

http2 最速実装 v2
http2 最速実装 v2 http2 最速実装 v2
http2 最速実装 v2
 
DB tech showcase_tokyo2018_LOCONDO
DB tech showcase_tokyo2018_LOCONDODB tech showcase_tokyo2018_LOCONDO
DB tech showcase_tokyo2018_LOCONDO
 
MySQL 入門的なはなし
MySQL 入門的なはなしMySQL 入門的なはなし
MySQL 入門的なはなし
 
MySQL勉強会 クエリチューニング編
MySQL勉強会 クエリチューニング編MySQL勉強会 クエリチューニング編
MySQL勉強会 クエリチューニング編
 
ふくよかなモデル
ふくよかなモデルふくよかなモデル
ふくよかなモデル
 
5 古雷my sql源碼與資料庫規範
5 古雷my sql源碼與資料庫規範5 古雷my sql源碼與資料庫規範
5 古雷my sql源碼與資料庫規範
 
削除フラグのはなし
削除フラグのはなし削除フラグのはなし
削除フラグのはなし
 
MySQLとPostgreSQLにおける基本的なアカウント管理
MySQLとPostgreSQLにおける基本的なアカウント管理MySQLとPostgreSQLにおける基本的なアカウント管理
MySQLとPostgreSQLにおける基本的なアカウント管理
 
Locondo 20190215@ec tech_group
Locondo 20190215@ec tech_groupLocondo 20190215@ec tech_group
Locondo 20190215@ec tech_group
 

メッチャ役に立つauto_incrementの話

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n