DEFAULT値と生成列
DEFAULT(NOW()、uuid_generate_v4()、'pending')を指定し、GENERATED ALWAYS AS列で値をその場で計算します。
「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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- NOT NULLとCHECK制約
- UNIQUE制約と複合キー
- FOREIGN KEYと参照アクション
- DEFAULT値と生成列