SQL Academy · レッスン

DEFAULT値と生成列

DEFAULT(NOW()、uuid_generate_v4()、'pending')を指定し、GENERATED ALWAYS AS列で値をその場で計算します。

レッスン 4/413 ステップ

「DEFAULT値と生成列」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。

DEFAULT:欠落した値を自動入力する

INSERTで列が省略されると、DEFAULTが使用されます。

CREATE TABLE users (
  id BIGSERIAL PRIMARY KEY,
  email VARCHAR(255) NOT NULL,
  status TEXT NOT NULL DEFAULT 'active',
  created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

よく使うDEFAULT

どこでも使うパターンです。

created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
id UUID PRIMARY KEY DEFAULT gen_random_uuid()
is_active BOOLEAN NOT NULL DEFAULT true
status TEXT NOT NULL DEFAULT 'pending'

後からDEFAULTを追加する

既存の行はデフォルトでは補完されません。DEFAULTが使われるのは新しいINSERTだけです。

ALTER TABLE users ALTER COLUMN status SET DEFAULT 'active';

-- For existing rows, backfill manually:
UPDATE users SET status = 'active' WHERE status IS NULL;

DEFAULT付きでNOT NULLを追加する

PostgreSQL 11以降では、定数のDEFAULTを持つNOT NULL列を高速に追加できます。テーブルは書き換えられません。

ALTER TABLE users
  ADD COLUMN signup_source TEXT NOT NULL DEFAULT 'web';
-- Fast in PG 11+, slow before

計算による生成列(STORED)

他の列から値が自動的に計算される列です。

CREATE TABLE orders (
  id BIGSERIAL PRIMARY KEY,
  qty INT NOT NULL,
  unit_price NUMERIC(10,2) NOT NULL,
  total NUMERIC(12,2) GENERATED ALWAYS AS (qty * unit_price) STORED
);

INSERT INTO orders (qty, unit_price) VALUES (3, 9.99);
SELECT * FROM orders;       -- total is auto-filled

全文検索用の生成tsvector

STORED生成列の優れた利用例です。

ALTER TABLE articles
  ADD COLUMN search_doc tsvector
    GENERATED ALWAYS AS (to_tsvector('english', title || ' ' || body)) STORED;
CREATE INDEX articles_search_idx ON articles USING GIN(search_doc);

仮想生成列

現在、PostgreSQLがサポートしているのはSTOREDだけです(仮想生成列は将来のバージョンで追加される予定です)。他のデータベース(MySQL)では、SELECT時に計算されるVIRTUAL列をサポートしています。

生成列にはINSERTできない

これらに書き込もうとするとエラーになります。これらは保存されるのではなく、計算によって求められるものだからです:

INSERT INTO orders (qty, unit_price, total) VALUES (3, 9.99, 30);
-- ERROR: column "total" can only be updated to DEFAULT

シーケンスに基づくデフォルト

SERIAL/BIGSERIALは「シーケンスからのデフォルト値」の省略記法です:

-- Roughly equivalent:
CREATE TABLE t (id BIGSERIAL PRIMARY KEY);

-- =>
CREATE SEQUENCE t_id_seq;
CREATE TABLE t (id BIGINT PRIMARY KEY DEFAULT nextval('t_id_seq'));
ALTER SEQUENCE t_id_seq OWNED BY t.id;

IDENTITY列

IDENTITYを定義する標準SQLの方法です:

CREATE TABLE t (
  id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  name TEXT
);

-- GENERATED BY DEFAULT AS IDENTITY allows explicit overrides.

DEFAULTとビジネスロジック

DEFAULTは単純に保ちます。複雑なロジックはアプリケーションコードかBEFORE INSERTトリガーに置きます。

まとめ

DEFAULTは空欄を埋め、GENERATEDは他の列から値を計算します。

  • NOW()、gen_random_uuid()、定数リテラル
  • 計算済みのSTORED列は派生データに最適です
  • IDENTITY列は現代的なPKのパターンです

クイックチェック

値が指定されない場合、INSERT時に現在時刻を自動入力する列にする句はどれですか?

無料で開始

AI チューターと学ぶ SQL — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
46
レッスン
183

よくある質問

「DEFAULT値と生成列」レッスンは無料ですか?

はい。「DEFAULT値と生成列」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。

「DEFAULT値と生成列」で何を学びますか?

DEFAULT(NOW()、uuid_generate_v4()、'pending')を指定し、GENERATED ALWAYS AS列で値をその場で計算します。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

SQL Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「DEFAULT値と生成列」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSQL Academyレッスンでコードを書いて実行できますか?

はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. NOT NULLとCHECK制約
  2. UNIQUE制約と複合キー
  3. FOREIGN KEYと参照アクション
  4. DEFAULT値と生成列
← SQL Academyに戻る