理系学生日記

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

忍者TOOLS

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

まだ Chapter 2.

Learning SQL

Learning SQL

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

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> 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> 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)

ふむ.