Databricks

Delta Constraintsで実現する品質制御|NOT NULL・CHECK・DLT Expectations比較

2026-03-26
更新: 2026-03-27
NicheeLab編集部

データパイプラインで「NULLが入ってはいけないカラムにNULLが入った」「負の金額が紛れ込んだ」 といった品質問題は、下流のレポートやMLモデルに波及して大きな手戻りを引き起こします。 Delta Constraintsは、テーブルレベルでデータ品質のルールを定義し、違反する書き込みを 自動的に拒否する仕組みです。

この記事では、NOT NULL制約とCHECK制約のSQL構文、DLT Expectationsとの使い分け、 制約の確認・削除方法、ストリーミング書き込み時の挙動、そして試験対策ポイントを整理します。

NOT NULL 制約

最もシンプルな制約です。指定したカラムにNULL値の書き込みを禁止します。

-- テーブル作成時に NOT NULL を指定
CREATE TABLE prod.silver.orders (
  order_id BIGINT NOT NULL,
  customer_id BIGINT NOT NULL,
  amount DECIMAL(10,2) NOT NULL,
  status STRING,
  created_at TIMESTAMP NOT NULL
);

-- 既存テーブルにNOT NULL制約を追加
ALTER TABLE prod.silver.orders
ALTER COLUMN status SET NOT NULL;

-- NOT NULL制約の削除
ALTER TABLE prod.silver.orders
ALTER COLUMN status DROP NOT NULL;

既存テーブルにNOT NULLを追加する場合、既にNULL値が存在するとALTER TABLEが失敗します。 事前にNULL行をUPDATEまたはDELETEで処理してから制約を追加してください。

CHECK 制約

CHECK制約はSQL式による条件を定義し、条件に違反する行の書き込みを拒否します。 複数のCHECK制約を同一テーブルに定義でき、すべての制約を満たす行のみが書き込まれます。

-- CHECK制約の追加(名前付き)
ALTER TABLE prod.silver.orders
ADD CONSTRAINT chk_amount_positive CHECK (amount > 0);

ALTER TABLE prod.silver.orders
ADD CONSTRAINT chk_status_valid CHECK (status IN ('pending', 'shipped', 'delivered', 'cancelled'));

ALTER TABLE prod.silver.orders
ADD CONSTRAINT chk_created_after_2020 CHECK (created_at >= '2020-01-01');

-- 複合条件のCHECK制約
ALTER TABLE prod.silver.orders
ADD CONSTRAINT chk_cancelled_has_reason CHECK (
  status != 'cancelled' OR cancel_reason IS NOT NULL
);

-- CHECK制約の削除
ALTER TABLE prod.silver.orders
DROP CONSTRAINT chk_amount_positive;

制約違反が発生すると、トランザクション全体がロールバックされます。 バッチ書き込みで1行でも違反があると、バッチ全体の書き込みが拒否されます。

制約の確認方法

-- テーブルの制約一覧を確認
DESCRIBE DETAIL prod.silver.orders;
-- properties列のdelta.constraints.xxx に制約定義が格納される

-- テーブル情報からNOT NULLを確認
DESCRIBE TABLE prod.silver.orders;
-- nullable列にfalseと表示されるカラムがNOT NULL制約付き

-- テーブルプロパティとして確認
SHOW TBLPROPERTIES prod.silver.orders;
-- delta.constraints.chk_amount_positive = 'amount > 0'
-- delta.constraints.chk_status_valid = 'status IN ...'

DLT Expectations との比較

比較軸Delta ConstraintsDLT Expectations
実行タイミング書き込み時(INSERT/UPDATE/MERGE/COPY INTO)DLTパイプラインの処理中
適用スコープテーブルへのすべての書き込み経路DLTパイプライン内の処理のみ
違反時の動作トランザクション全体をロールバック(fail only)warn(警告のみ)/ drop(除外)/ fail(停止)を選択可能
メタデータ記録テーブルプロパティに制約定義を保存パイプラインイベントログに品質メトリクスを記録
品質ダッシュボードなし(手動確認が必要)DLT UIで自動的にメトリクス表示
不良レコード隔離不可(拒否のみ)quarantineテーブルへの隔離が可能
-- DLT Expectationsの例(参考)
CREATE OR REFRESH STREAMING LIVE TABLE silver_orders (
  CONSTRAINT valid_amount EXPECT (amount > 0) ON VIOLATION DROP ROW,
  CONSTRAINT valid_status EXPECT (status IS NOT NULL) ON VIOLATION FAIL UPDATE
)
AS SELECT * FROM STREAM(LIVE.bronze_orders);

ストリーミング書き込み時の挙動

Structured Streamingでマイクロバッチ書き込みを行う際も、Delta Constraintsは有効です。 マイクロバッチ内に制約違反の行が含まれると、そのバッチ全体がロールバックされ、 ストリームはエラーで停止します。

  • foreachBatch内でMERGEを実行する場合も制約チェックが適用される
  • Auto Loaderからの書き込みでも制約チェックが動作する
  • ストリーム停止後は、違反データの原因を修正してストリームを再起動する必要がある

ストリーミングパイプラインでは、Delta Constraintsの「fail only」挙動が厳しすぎる場合があります。 DLT ExpectationsのDROP ROWで不良レコードを除外し、Delta Constraintsは「最後の安全ネット」として 残すのが実務上のベストプラクティスです。

制約設計のベストプラクティス

  • 主キー相当のカラム(order_id等)にはNOT NULLを必ず設定する
  • 金額・数量にはCHECK制約で正の値を強制する(amount > 0)
  • ステータス値にはIN句でENUM的な制約を定義する
  • 制約名は分かりやすく命名する(chk_プレフィックスを推奨)
  • 既存テーブルに制約を追加する前に、違反データの有無を事前チェックする
  • DLT ExpectationsのDROP ROWと併用して多層防御を構成する
-- 既存データの違反チェック(制約追加前に実行)
SELECT COUNT(*) AS violation_count
FROM prod.silver.orders
WHERE amount <= 0;

SELECT COUNT(*) AS null_count
FROM prod.silver.orders
WHERE customer_id IS NULL;

試験で問われるポイント

  • NOT NULLとCHECK制約の構文(ALTER TABLE ... ADD CONSTRAINT)
  • 制約違反時の挙動: トランザクション全体がロールバックされる
  • DLT Expectationsとの違い: 適用スコープと違反時動作の柔軟性
  • CHECK制約で使えない式: サブクエリ、集約関数、UDF
  • 制約の確認方法: DESCRIBE DETAIL / SHOW TBLPROPERTIES
  • ストリーミング時にも制約が有効であること

問題で確認

Data Engineer Associate / Professional

問題 1

Silver層のordersテーブルにamount > 0のCHECK制約が設定されている。Structured Streamingのマイクロバッチで100行が書き込まれ、うち1行のamountが-50だった。この場合の挙動として正しいのはどれか。

  1. マイクロバッチの100行すべてがロールバックされ、ストリームがエラーで停止する
  2. amountが-50の1行のみスキップされ、残りの99行が正常に書き込まれる
  3. amountが-50の行が自動的に0に修正されて100行すべて書き込まれる
  4. 制約違反が警告ログに記録されるが、100行すべて正常に書き込まれる

正解: A

Delta ConstraintsのCHECK制約違反は、DLT Expectationsと異なり「fail only」で動作します。1行でも違反があるとトランザクション(マイクロバッチ)全体がロールバックされ、ストリームが停止します。行単位のスキップ、自動修正、警告のみの挙動はDelta Constraintsにはありません。行単位の制御が必要な場合はDLT ExpectationsのDROP ROWを使います。

よくある質問

Delta ConstraintsとDLT Expectationsはどちらを使うべきですか?

併用が推奨されます。Delta Constraints(NOT NULL/CHECK)はテーブルレベルで常に強制される「最後の防衛線」で、どの書き込み経路からも制約違反を防ぎます。DLT Expectationsはパイプライン内で品質メトリクスの計測や不良レコードの隔離(quarantine)を行う「パイプラインレベルの品質ゲート」です。DLT ExpectationsのdropやfailアクションとDelta Constraintsを組み合わせると、多層的なデータ品質管理が実現できます。

CHECK制約で使えるSQLの範囲は?

CHECK制約では単一行の評価で完結する式のみ使用できます。サブクエリ、集約関数(COUNT, SUM等)、ウィンドウ関数、UDFは使えません。使えるのはカラム参照、リテラル、比較演算子(=, <, >, !=)、論理演算子(AND, OR, NOT)、IS NULL / IS NOT NULL、BETWEEN、IN、LIKE、CASE WHEN等です。

制約違反時のエラーメッセージはカスタマイズできますか?

制約名(CONSTRAINT句のエイリアス)がエラーメッセージに含まれますが、カスタムメッセージの指定はできません。制約名を分かりやすく命名する(例: chk_amount_positive, chk_status_valid)ことで、エラー発生時の原因特定を容易にする運用が推奨されます。

この記事で学んだ内容を問題で確認しましょう

16,000問以上の問題で実力チェック

無料で問題を解いてみる
この記事の著者

NicheeLab編集部

データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。


関連記事
Databricks

Databricks資格一覧|全7試験・難易度・勉強法

Databricks認定資格全7試験の一覧・難易度・出題範囲・合格ラインを徹底解説。2026年最新版の公式試験ガイドに準...

Databricks

Databricks試験の難易度ランキング|全7資格を徹底比較

Databricks認定全7試験の難易度をランキング形式で徹底比較。合格率・学習時間・出題傾向から難易度を分析。...

Databricks

Databricks資格の勉強方法|最短合格ルートと学習時間の目安

Databricks認定資格に最短で合格するための勉強方法を完全ガイド。公式リソース・問題集・学習スケジュールを徹底解説...

Databricks

Databricks Data Engineer Associate完全解説|出題範囲・問題例・合格戦略

Databricks Certified Data Engineer Associate試験を徹底解説。5つの出題ドメイ...

Databricks

Databricks Data Engineer Professional完全解説|上級試験の攻略法

Databricks Certified Data Engineer Professional試験を徹底解説。10の出題...

Databricksの記事一覧 (105件)
© 2026 NicheeLab All rights reserved.