0Pricing
SQL Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

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

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