理系学生日記

おまえはいつまで学生気分なのか

主キーとなる id を自動インクリメントする

まだ Chapter 2.

ISBN:978-0596007270:detail

値の挿入段階において,挿入するレコードの主キーの id は,その時点でのテーブル中の最大の主キー id + 1 として insert してやれば事は足りると思ってたんだけど,それだとマルチユーザの状況では主キーが被ってしまうという問題があるみたい.これを回避するために,MySQL には auto_increment なる機能が用意されている.

|mysql| mysql> ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT; Query OK, 0 rows affected (0.36 sec) Records: 0 Duplicates: 0 Warnings: 0 ||< これで,person_id を NULL としてやれば,MySQL が勝手にインクリメントしてくれるわけか.なるほど.

じゃぁ,ということで INSERT 文で挿入してやって,SELECT 文で表示してやる.このあたりは覚えてるぞ.

|mysql| mysql> INSERT INTO person -> (person_id, fname, lname, gender, birth_date) -> VALUES ( null, 'William', 'Turner', 'M', '1972-05-27' ); Query OK, 1 row affected (0.00 sec)

mysql> SELECT person_id, fname, lname, birth_date FROM person; +-----------+---------+--------+------------+ | person_id | fname | lname | birth_date | +-----------+---------+--------+------------+ | 1 | William | Turner | 1972-05-27 | +-----------+---------+--------+------------+ 1 row in set (0.00 sec) ||<

おぉ,NULL を渡したはずの person_id が,確かに 1 になっている. もう一個.

|mysql| mysql> insert into person (person_id, fname, lname, gender, birth_date, address, city, state, country, postal_code) -> VALUES(null, 'Susan', 'Smith', 'F', '1975-11-02', '23 Maple St.', 'Arlington', 'VA', 'USA', '20220' ); Query OK, 1 row affected (0.00 sec)

mysql> select * from person; +-----------+---------+--------+--------+------------+--------------+-----------+-------+---------+-------------+ | person_id | fname | lname | gender | birth_date | address | city | state | country | postal_code | +-----------+---------+--------+--------+------------+--------------+-----------+-------+---------+-------------+ | 1 | William | Turner | M | 1972-05-27 | NULL | NULL | NULL | NULL | NULL | | 2 | Susan | Smith | F | 1975-11-02 | 23 Maple St. | Arlington | VA | USA | 20220 | +-----------+---------+--------+--------+------------+--------------+-----------+-------+---------+-------------+ 2 rows in set (0.00 sec) ||< ふむ.