本文へスキップ
BecomeCoder

SQL テーブル設計 (DDL)コース · 第2章 キーと制約を極める · レッスン8

主キーと自動採番 ― IDを自動で振る

ブラウザで完結

導入

新しい行を追加するたびに「次の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 の SERIALIDENTITY、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 を書かなければ、自動で採番されます。

実際に動かしてみよう

下のエディタにクエリを書いて「実行」を押すと、ブラウザ内のSQLiteで結果が表示されます。本文の例をそのまま試したり、書き換えたりしてみましょう。

SQL — ブラウザ内で実行(SQLite)

ブラウザ内でSQLを動かす環境(SQLite)を読み込みます(初回のみ一瞬)。
スクロールして表示された時点でも自動で読み込まれます。