導入
新しい行を追加するたびに「次のIDはいくつだっけ?」と自分で管理するのは大変だし、間違えれば重複します。そこで多くのテーブルは、IDを DB に自動で振らせます。この「自動採番」の仕組みを押さえましょう。
説明
SQLite では、列を INTEGER PRIMARY KEY と定義すると、その列は自動採番になります。INSERT のときに id を省く(値を指定しない)と、DB が「今ある最大値+1」を自動で入れてくれます。
CREATE TABLE tag (id INTEGER PRIMARY KEY, name TEXT NOT NULL);
INSERT INTO tag (name) VALUES ('新着'); -- id を書かない
INSERT INTO tag (name) VALUES ('セール'); -- 自動で 2 が入る
SELECT * FROM tag;
flowchart LR
I["INSERT(id を省略)"] --> DB["DB が次の番号を採番<br/>1, 2, 3, …"]
主キー(PRIMARY KEY)は「各行をただ1つに識別する目印」で、次の2つの性質を自動で持ちます。重複できない(同じ id は2つ入らない)・NULL にできない(必ず値がある)。これがあるおかげで、「その行を指す」ことが常に一意にできます。
より厳密に「一度使った番号を二度と使い回さない」ことを保証したいときは
INTEGER PRIMARY KEY AUTOINCREMENTと書きます。MySQL のAUTO_INCREMENT、PostgreSQL のSERIAL/IDENTITY、Oracle の「シーケンス」も、狙いは同じ「自動採番」です。
やってみよう
初期表示のクエリを実行し、id を指定していないのに 1・2 が自動で振られることを確認しましょう。続けて INSERT INTO tag (name) VALUES ('限定'); をもう一度実行し、SELECT * FROM tag; で 3 が自動採番されることを見てください。
演習
member というテーブルを、id(自動採番の主キー)と name(TEXT・NOT NULL)で作り、id を指定せずに1件 '田中' を追加してください。
ヒント1を見る
CREATE TABLE member (id INTEGER PRIMARY KEY, name TEXT NOT NULL); のあと、INSERT INTO member (name) VALUES ('田中');
ヒント2を見る
INSERT で id を書かなければ、自動で採番されます。