NOT NULLとCHECK制約
NOT NULLで欠損値を禁止し、CHECK(price > 0、status IN ('active','archived'))でドメインルールを検証します。
「NOT NULLとCHECK制約」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
制約が必要な理由
制約によって、検証処理をデータベース内に組み込めます。メリットは非常に大きく、すべてのアプリケーション、スクリプト、アドホッククエリが有効なデータを書き込むか、明確に失敗するようになります。
NOT NULL
最も単純な制約です。この列には値が必要です。
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
email VARCHAR(255) NOT NULL,
age INT -- NULL allowed
);後からNOT NULLを追加する
まず既存の行を補完し、その後で制約を追加します。
UPDATE users SET email = 'unknown@example.com' WHERE email IS NULL;
ALTER TABLE users ALTER COLUMN email SET NOT NULL;CHECK制約
すべての行が満たす必要のある、任意の真偽式です。
CREATE TABLE products (
id BIGSERIAL PRIMARY KEY,
name TEXT NOT NULL,
price NUMERIC(10,2) NOT NULL CHECK (price > 0),
discount NUMERIC(5,2) DEFAULT 0 CHECK (discount BETWEEN 0 AND 100)
);列挙値のような値を使ったCHECK
列に設定できる値を、固定された集合に制限します。
CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
status TEXT NOT NULL
CHECK (status IN ('pending','paid','shipped','cancelled'))
);NULLはCHECKを暗黙的に通過する
CHECK制約は、式がNULL(不明)の場合に通過します。確実に値を要求する場合は、NOT NULLと組み合わせてください。
CREATE TABLE invoices (
amount NUMERIC(10,2) NOT NULL CHECK (amount > 0)
);複数列のCHECK
複数の列を参照できます。
CREATE TABLE bookings (
start_at TIMESTAMPTZ NOT NULL,
end_at TIMESTAMPTZ NOT NULL,
CHECK (start_at < end_at)
);後からCHECKを追加する
まず既存の行を検証し、その後で制約を追加します。
ALTER TABLE products
ADD CONSTRAINT positive_price CHECK (price > 0);
-- fails if any row violates it大きなテーブルで使うNOT VALIDのテクニック
最初の全件スキャンを省略し、後でバックグラウンドで検証します。
ALTER TABLE products
ADD CONSTRAINT positive_price CHECK (price > 0) NOT VALID;
ALTER TABLE products VALIDATE CONSTRAINT positive_price;名前付き制約
エラーメッセージとマイグレーションの動作を予測しやすくするため、制約には必ず名前を付けます。
ALTER TABLE products
ADD CONSTRAINT products_price_positive CHECK (price > 0);ロジックをアプリケーションで重複させない
データベースが制約を適用すれば、すべてのコードパスでその恩恵を受けられます。「検証を忘れた」ということもありません。ユーザー体験のため、アプリケーション側にも重複した検証を残して即時フィードバックを行うのは構いませんが、信頼できる唯一の情報源はデータベースにしてください。
まとめ
NOT NULLとCHECKによって、よくある不正なデータの多くを排除できます。
- NOT NULL:値の欠落を許可しません
- CHECK:行ごとに任意のルールを適用します
- オンラインで追加する場合はNOT VALID + VALIDATEを使用します
理解度チェック
NOT NULLのない列にCHECK (price > 0)を設定すると、どうなりますか。
よくある質問
「NOT NULLとCHECK制約」レッスンは無料ですか?
はい。「NOT NULLとCHECK制約」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「NOT NULLとCHECK制約」で何を学びますか?
NOT NULLで欠損値を禁止し、CHECK(price > 0、status IN ('active','archived'))でドメインルールを検証します。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「NOT NULLとCHECK制約」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- NOT NULLとCHECK制約
- UNIQUE制約と複合キー
- FOREIGN KEYと参照アクション
- DEFAULT値と生成列