Kodokon kodokon.com

スキーマを作る:CREATE TABLE と制約

適切な型と、データを守る NOT NULL、UNIQUE、PRIMARY KEY 制約を使って、自分自身のテーブルを設計しましょう。

8 分 · 3 問

このレッスンを Kodokon で開く

ここまでは出来合いのテーブルに問い合わせてきました。プロの開発者はそれらを設計します。良いスキーマは、挿入の時点で不正なデータを拒みます。どんなアプリケーションのコードよりも前にある、あなたの第一の防衛線です。sqliteonline.com か sqlite3 で、このテーブルを作りましょう。

SQL
CREATE TABLE users (
  id INTEGER PRIMARY KEY,
  email TEXT NOT NULL UNIQUE,
  username TEXT NOT NULL UNIQUE,
  created_at TEXT NOT NULL
    DEFAULT (datetime('now'))
);
三つの制約:NOT NULL、UNIQUE、そしてデフォルト値。

SQLiteは五つの保存型しか知りません。INTEGERREALTEXTBLOBNULL です。日付はそこにISO形式(2026-07-04)の TEXT として保存されます。他のところ(PostgreSQL、MySQL)では、代わりに VARCHAR(255)TIMESTAMPBOOLEAN と宣言するでしょう。原理は同じで、型の名前が変わるだけです。では、制約をテストしてみましょう。

SQL
INSERT INTO users (email, username)
VALUES ('alice@example.com', 'alice');

INSERT INTO users (email, username)
VALUES ('alice@example.com', 'alice2');
二つ目の挿入は失敗します:UNIQUE constraint failed。

主キーは各行を識別します。決してNULLにならず、重複せず、テーブルにつき一つだけです。SQLiteでは、INTEGER PRIMARY KEY に貴重な特徴があります。上の挿入のように値を省くと、列が自動的に増えていくのです。PostgreSQLなら GENERATED ALWAYS AS IDENTITY、MySQLなら AUTO_INCREMENT と書くでしょう。最後に、CHECK で業務上のルールを加えましょう。

SQL
CREATE TABLE products (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  sku TEXT NOT NULL UNIQUE,
  price REAL NOT NULL CHECK (price >= 0)
);

INSERT INTO products (name, sku, price)
VALUES ('Keyboard', 'KB-01', -5);
拒否されます:CHECK constraint failed。負の価格は一つも通りません。

理解度チェック

このレッスンの要点をしっかり覚えているか確認しましょう。

  1. email 列に重複が現れないことを保証する制約はどれですか?
    • NOT NULL
    • UNIQUE
    • CHECK
    • DEFAULT
  2. PRIMARY KEY と UNIQUE の違いは何ですか?
    • 違いはない、同義語である
    • 主キーは行を識別する:テーブルにつき一つだけ、決してNULLにならない
    • UNIQUE のほうが PRIMARY KEY より厳しい
  3. SQLiteで、INTEGER PRIMARY KEY 列の値を指定せずに行を挿入するとどうなりますか?
    • NOT NULL エラーが発生する
    • SQLiteが自動的に一意な整数を生成する
    • 列がNULLのままになる