メインコンテンツまでスキップ

Databricks の制約

Databricksは、標準的なSQL制約管理句をサポートしています。

  • 強制された制約では、テーブルに行を追加する前にデータの完全性が検証されます。
  • 情報制約(主キー、外部キー、および一意制約)は、テーブル内のフィールド間のリレーションシップを定義しますが、強制されません。

Databricks のすべての制約には Delta Lake が必要です。

LakeFlow Spark宣言型パイプラインの関連概念については、 「パイプラインの期待に基づいたデータ品質の管理」を参照してください。

適用される制約

制約に違反した場合、トランザクションはエラーで失敗します。Databricksは2種類の制約をサポートしています。

  • NOT NULL: 特定の列の値を null にできないことを示します。
  • CHECK: 指定されたブール式が各入力行に対して true である必要があることを示します。
注記

制約を追加すると、現在のライターバージョンが 3 未満の場合にテーブルライタープロトコルがアップグレードされます。これは、外部の Delta Lake クライアントとの互換性に影響を与える可能性があります。Delta Lake 機能の互換性とプロトコルを参照してください。

NOT NULL制約

テーブルを作成する際は、スキーマにNOT NULL制約を指定してください。NOT NULL制約を削除または追加するには、 ALTER TABLE ... ALTER COLUMNコマンドを使用します。

SQL
CREATE TABLE people10m (
id INT NOT NULL,
firstName STRING,
middleName STRING NOT NULL,
lastName STRING,
gender STRING,
birthDate TIMESTAMP,
ssn STRING,
salary INT
);

ALTER TABLE people10m ALTER COLUMN middleName DROP NOT NULL;
ALTER TABLE people10m ALTER COLUMN ssn SET NOT NULL;

Databricksは、テーブルにNOT NULL制約を追加する前に、既存のすべての行が制約を満たしていることを確認します。

構造体内にネストされた列にNOT NULL制約を指定する場合、親構造体もnullであってはなりません。配列型またはマップ型の中にネストされた列は、 NOT NULL制約を受け入れません。

CREATE TABLE [USING]ALTER TABLE ALTER COLUMNを参照してください。

CHECK制約

CHECK制約はALTER TABLE ADD CONSTRAINTコマンドとALTER TABLE DROP CONSTRAINTコマンドで管理します。ALTER TABLE ADD CONSTRAINT 、テーブルに制約を追加する前に、既存のすべての行が制約を満たしていることを確認します。

チェック制約には以下の制限が適用されます。

  • CHECK制約式では、以下の種類の関数を除き、同じ引数値が与えられた場合に常に同じ結果を返すSparkのSQL関数を使用できます。
    • ユーザー定義関数
    • 集計関数
    • ウィンドウ関数
    • 複数の行を返す関数

既存のテーブルに追加する

SQL
CREATE TABLE people10m (
id INT,
firstName STRING,
middleName STRING,
lastName STRING,
gender STRING,
birthDate TIMESTAMP,
ssn STRING,
salary INT
);

ALTER TABLE people10m ADD CONSTRAINT dateWithinRange CHECK (birthDate > '1900-01-01');
ALTER TABLE people10m DROP CONSTRAINT dateWithinRange;

ALTER TABLE ADD CONSTRAINTALTER TABLE DROP CONSTRAINTを参照してください。

チェック制約テーブルのプロパティを表示する

テーブルのCHECK制約を表示するには、 DESCRIBE DETAILコマンドとSHOW TBLPROPERTIESコマンドを使用します。

SQL
ALTER TABLE people10m ADD CONSTRAINT validIds CHECK (id > 1 and id < 99999999);

DESCRIBE DETAIL people10m;

SHOW TBLPROPERTIES people10m;

チェック制約を削除する

Databricks Runtime 15.4 LTS以降では、 DROP FEATUREコマンドを使用してテーブルからチェック制約を削除し、テーブルプロトコルをダウングレードします。

Delta Lake テーブル機能の削除およびテーブル プロトコルのダウングレードを参照してください。

主キー、外部キー、および一意性制約を宣言する

主キー、外部キー、および一意制約は情報提供のみを目的としており、強制されません。クエリの最適化により、パフォーマンスが向上する可能性があります。

  • **プライマリキーと外部キー**: Databricks Runtime 13.3 LTS 以降の Unity Catalog および Delta Lake テーブルで利用可能です。Databricks Runtime 15.2 以降で一般提供されます。外部キーは、別のテーブル内のプライマリキーまたは一意制約を参照する必要があります。
  • Unique : Databricks SQL および Databricks Runtime 18.2 以降の Unity Catalog および Delta Lake テーブルでパブリックプレビューとして利用可能です。テーブルは複数の「一意制約」を持つことができます。外部キーは、REFERENCES parent_table(unique_col) を使用して一意の列を参照できます。一意の列は NULL 可能にできます。これは、NULL の値が互いに異なるものとして扱われるためです。

information_schemaをクエリするか、DESCRIBE TABLE EXTENDEDまたはSHOW CREATE TABLEを使用して、特定のカタログにわたる制約の適用方法の詳細を取得します。

新しいテーブルに追加

テーブル作成時におけるテーブル仕様句の一部として、主キー、外部キー、および一意制約を宣言する

SQL
CREATE TABLE T(pk1 INTEGER NOT NULL, pk2 INTEGER NOT NULL,
CONSTRAINT t_pk PRIMARY KEY(pk1, pk2));
CREATE TABLE S(pk INTEGER NOT NULL PRIMARY KEY,
fk1 INTEGER, fk2 INTEGER,
CONSTRAINT s_t_fk FOREIGN KEY(fk1, fk2) REFERENCES T);
CREATE TABLE U(id INTEGER NOT NULL, email STRING NOT NULL,
CONSTRAINT u_uq_email UNIQUE(email));

CTASステートメントはこの制約句をサポートしていません。

既存のテーブルに追加する

既存のテーブルに制約を追加するには:

SQL
ALTER TABLE T ADD CONSTRAINT t_pk PRIMARY KEY(pk1, pk2);
ALTER TABLE S ADD CONSTRAINT s_t_fk FOREIGN KEY(fk1, fk2) REFERENCES T;
ALTER TABLE U ADD CONSTRAINT u_uq_email UNIQUE(email);

その他のリソース