データパイプラインで「NULLが入ってはいけないカラムにNULLが入った」「負の金額が紛れ込んだ」 といった品質問題は、下流のレポートやMLモデルに波及して大きな手戻りを引き起こします。 Delta Constraintsは、テーブルレベルでデータ品質のルールを定義し、違反する書き込みを 自動的に拒否する仕組みです。
この記事では、NOT NULL制約とCHECK制約のSQL構文、DLT Expectationsとの使い分け、 制約の確認・削除方法、ストリーミング書き込み時の挙動、そして試験対策ポイントを整理します。
最もシンプルな制約です。指定したカラムに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制約は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 ...'| 比較軸 | Delta Constraints | DLT 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は有効です。 マイクロバッチ内に制約違反の行が含まれると、そのバッチ全体がロールバックされ、 ストリームはエラーで停止します。
ストリーミングパイプラインでは、Delta Constraintsの「fail only」挙動が厳しすぎる場合があります。 DLT ExpectationsのDROP ROWで不良レコードを除外し、Delta Constraintsは「最後の安全ネット」として 残すのが実務上のベストプラクティスです。
-- 既存データの違反チェック(制約追加前に実行)
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;Data Engineer Associate / Professional
問題 1
Silver層のordersテーブルにamount > 0のCHECK制約が設定されている。Structured Streamingのマイクロバッチで100行が書き込まれ、うち1行のamountが-50だった。この場合の挙動として正しいのはどれか。
正解: 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)ことで、エラー発生時の原因特定を容易にする運用が推奨されます。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Databricks資格一覧|全7試験・難易度・勉強法
Databricks認定資格全7試験の一覧・難易度・出題範囲・合格ラインを徹底解説。2026年最新版の公式試験ガイドに準...
Databricks試験の難易度ランキング|全7資格を徹底比較
Databricks認定全7試験の難易度をランキング形式で徹底比較。合格率・学習時間・出題傾向から難易度を分析。...
Databricks資格の勉強方法|最短合格ルートと学習時間の目安
Databricks認定資格に最短で合格するための勉強方法を完全ガイド。公式リソース・問題集・学習スケジュールを徹底解説...
Databricks Data Engineer Associate完全解説|出題範囲・問題例・合格戦略
Databricks Certified Data Engineer Associate試験を徹底解説。5つの出題ドメイ...
Databricks Data Engineer Professional完全解説|上級試験の攻略法
Databricks Certified Data Engineer Professional試験を徹底解説。10の出題...