Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

メッチャ役に立つauto_incrementの話

8.237 Aufrufe

Veröffentlicht am

2012/06/27
MySQL Casual Talks @gumi福岡
#mysqlcf

  • Als Erste(r) kommentieren

メッチャ役に立つauto_incrementの話

  1. 1. メッチャ役に立つauto_incrementの話 @kitakoh 2012
  2. 2. 自己紹介@kitakoh(放置中…)大分から来ましたパン食べるパンよろしくお願いします!
  3. 3. auto_increment通し番号を自動で振ってくれる機能
  4. 4. user_id(auto_increment),user_name(char 10)だけのテーブルで実験
  5. 5. 普通にINSERTINSERT INTO tbl (user_name)VALUES(‘user01’),(‘user02’),(‘user03’);
  6. 6. 普通にINSERT +---------+-----------+ | user_id | user_name | +---------+-----------+ | 1 | user01 | | 2 | user02 | | 3 | user03 | +---------+-----------+3 rows in set (0.00 sec)
  7. 7. user_id=2をDELETE +---------+-----------+ | user_id | user_name | +---------+-----------+ | 1 | user01 | | ! 2 | user02 | | 3 | user03 | +---------+-----------+ 3 rows in set (0.00 sec)
  8. 8. この状態で新規行をINSERT +---------+-----------+ | user_id | user_name | +---------+-----------+ | 1 | user01 | | 3 | user03 | +---------+-----------+ 2 rows in set (0.00 sec)
  9. 9. 最後に追加された +---------+-----------+ | user_id | user_name | +---------+-----------+ | 1 | user01 | | 3 | user03 | | ! 4 | userXX | +---------+-----------+3 rows in set (0.00 sec)
  10. 10. 最後の行をDELETEしてINSERTすると? +---------+-----------+ | user_id | user_name | +---------+-----------+ | 1 | user01 | | 3 | user03 | | ! 4 | userXX | +---------+-----------+ 3 rows in set (0.00 sec)
  11. 11. 最後に追加された +---------+-----------+ | user_id | user_name | +---------+-----------+ | 1 | user01 | | 3 | user03 | | ! 5 | userYY | +---------+-----------+3 rows in set (0.00 sec)
  12. 12. auto_incrementで振られるシーケンスは再利用され ない
  13. 13. user_idを指定してみるINSERT INTO tbl (user_id, user_name)VALUES (10, ‘user10’);
  14. 14. ここに新規行をINSERT +---------+-----------+ | user_id | user_name | +---------+-----------+ | 1 | user01 | | 3 | user03 | | 4 | userXX | | 5 | userYY | | 10 | user10 | +---------+-----------+
  15. 15. 最後に追加された+---------+-----------+| user_id | user_name |+---------+-----------+| 1 | user01 || 3 | user03 || 4 | userXX || 5 | userYY || 10 | user10 || ! 11 | userZZ |+---------+-----------+
  16. 16. 歯抜けのuser_idを指定INSERT INTO tbl (user_id, user_name)VALUES (2, ‘user2’);
  17. 17. 指定場所に追加される +---------+-----------+ | user_id | user_name | +---------+-----------+ | 1 | user01 | | ! 2 | user02 | | 3 | user03 | | 4 | userXX | | 5 | userYY | | 10 | user10 | | 11 | userZZ |
  18. 18. シーケンスは基本的に再利用されないが、値を指定す れば再利用可能
  19. 19. 全行DELETEするとどうなる?(シーケンス11まで振られている状態で)DELETE FROM tbl;INSERT INTO tbl(user_name)VALUES(‘userXX’);
  20. 20. 最後に追加される +---------+-----------+ | user_id | user_name | +---------+-----------+ | 12 | userXX | +---------+-----------+1 rows in set (0.00 sec)
  21. 21. テーブルをTRUNCATEするとどうなる?(シーケンスが12まで振られてる状態で)TRUNCATE TABLE tbl;INSERT INTOtbl(user_name)VALUES(‘userXX’);
  22. 22. シーケンスが巻き戻った +---------+-----------+ | user_id | user_name | +---------+-----------+ | 1 | userXX | +---------+-----------+ 1 rows in set (0.00 sec) ※MySQL5.5
  23. 23. DELETEでは巻き戻らないが、 TRUNCATEだと巻き戻る
  24. 24. user_idが最大値の状態でINSERTINSERT INTO tbl(user_id, user_name)VALUES(127, ‘userXX’); +---------+-----------+ | user_id | user_name | +---------+-----------+ | 127 | userXX | +---------+-----------+ ↑TINYINT(SIGNED)
  25. 25. ERRORになるERROR 1062 (23000): Duplicate entry127 for key PRIMARY
  26. 26. シーケンス値は、ALTER文で指定できるALTER TABLE tbl auto_increment = 10;10に指定しているので、新規行INSERTすると11から入る
  27. 27. 今のシーケンス値を知る方法 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 |+-------+------------------------------------------------+
  28. 28. 複合キーでauto_incrementCREATE TABLE tbl( dept_id TINYINT, ←部門IDを追加 user_id TINYINT AUTO_INCREMENT, user_name CHAR(10), PRIMARY KEY(dept_id, user_id))ENGINE=MyISAM;
  29. 29. 複合キーでauto_incrementinsert 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してみる
  30. 30. 複合キーで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)
  31. 31. 複合キーでauto_increment dept_idとuser_idで重 複しないように、自動的に user_idを連番で振ってく れます。(MyISAM限定)
  32. 32. メッチャ役に立つauto_incrementの話 完 ご清聴下さった皆様、 場所をご提供下さいましたgumi様、 ありがとうございました

×