PostgreSQLは制約(テーブルデータに対するルール)を通じてデータ整合性を強制します。標準的な制約(PRIMARY KEY、FOREIGN KEY、UNIQUE、NOT NULL、CHECK、DEFAULT)の他に、PostgresはEXCLUDE制約や柔軟なCHECK式といった強力なオプションを提供します。
標準的な制約
CREATE TABLE bookings (
id SERIAL PRIMARY KEY, -- unique identifier
room_id INT NOT NULL REFERENCES rooms(id), -- foreign key (referential integrity)
email VARCHAR(255) UNIQUE NOT NULL, -- unique + required
guests INT CHECK (guests > 0 AND guests <= 10), -- value constraint
status TEXT DEFAULT 'pending' -- default value
);
PRIMARY KEY → unique row identifier
FOREIGN KEY → references another table (referential integrity, with ON DELETE options)
UNIQUE → no duplicate values
NOT NULL → must have a value
CHECK → value must satisfy a condition
DEFAULT → default value when not provided
CHECK制約 — ドメインルールを強制する
CHECK (price > 0)
CHECK (end_date > start_date) -- logical consistency between columns
CHECK (status IN ('active', 'inactive', 'pending'))
CHECK (email ~ '^[^@]+@[^@]+\.[^@]+$') -- regex validation
PostgresのCHECK制約は、列間の条件や正規表現パターンを含む、豊かなビジネスルールを強制できます。
EXCLUDE制約 — Postgresの強力な機能
-- prevent OVERLAPPING bookings for the same room (impossible with UNIQUE alone!)
CREATE TABLE bookings (
room_id INT,
during TSRANGE, -- a time range
EXCLUDE USING GIST (room_id WITH =, during WITH &&) -- no two rows where room_id is
); -- equal AND time ranges OVERLAP
EXCLUDE制約(Postgres固有の機能)は、カスタム演算子による競合行を防止します。特に、UNIQUE制約では実現できない時間範囲の重複(二重予約)を防止することで有名です。
遅延可能制約
-- check constraints at COMMIT instead of immediately (useful for circular references)
FOREIGN KEY (...) REFERENCES ... DEFERRABLE INITIALLY DEFERRED
なぜ重要なのか
制約はデータ整合性に不可欠です。データルールをデータベースレベル(最後の防衛線であり、アプリケーションコードに関わらず常に強制される)で強制するため、PostgreSQLの制約サポートの理解は堅牢なデータベース設計に重要です。
標準的な制約(参照整合性を伴うPRIMARY KEY、FOREIGN KEY、UNIQUE、NOT NULL、CHECK、DEFAULT)と各々が強制する内容を理解することは、スキーマ設計の基本であり、一意性、有効な参照、必須値、有効なデータという保証を提供し、バグ、競合状態、不整合なデータからアプリケーションコード単独では実現できない方法で保護します。
Postgresの**CHECK**制約は特に優れており、列間条件(end_date > start_dateのような論理的一貫性)や正規表現パターンを含む豊かなビジネスルールを強制でき、ドメインルールをスキーマに直接エンコードできます。
特に価値があるのは、Postgres固有の**EXCLUDE制約です。これはカスタム演算子による競合行を防止し、特に時間範囲の重複**(部屋やリソースの二重予約)を防止する強力な機能を提供します。これは標準的なUNIQUE制約では実現できない能力であり、スケジューリングや予約といった一般的な実世界の問題をデータベースレベルで優雅に解決します。
制約を理解する — 整合性のための標準的な制約、Postgresの柔軟なCHECK式、競合防止のための強力なEXCLUDE — ことは、正確性を自動的に強制するデータベース設計に重要です。
データ整合性は重要であり、制約はアプリケーションコードが提供できない保証を提供するため、そしてPostgresは基本的な機能を超えた強力なオプション(豊かなCHECK、重複防止のためのEXCLUDE)を提供するため、PostgreSQLの制約サポートの理解は、堅牢なデータベース構築のための実用的で関連性のある知識です。特にEXCLUDE制約は、スケジューリング/予約システムで知る価値のあるPostgres特有の有用な機能です。
