Databricks の制約
Databricksは、標準的なSQL制約管理句をサポートしています。
- 強制された制約では、テーブルに行を追加する前にデータの完全性が検証されます。
- 情報提供用の主キー、外部キー、および一意制約は、テーブル内のフィールド間の関係を定義しますが、強制されません。
Databricks のすべての制約には Delta Lake が必要です。
LakeFlow Spark宣言型パイプラインの関連概念については、 「パイプラインの期待に基づいたデータ品質の管理」を参照してください。
Databricksに対する強制的な制約
制約に違反した場合、トランザクションはエラーで失敗します。Databricksは2種類の制約をサポートしています。
NOT NULL: 特定の列の値を null にできないことを示します。CHECK: 指定されたブール式が各入力行に対して true である必要があることを示します。
制約を追加すると、以前のライターバージョンが3未満だった場合、Databricksはテーブルライタープロトコルバージョンを自動的にアップグレードします。テーブルプロトコルのバージョン管理と、プロトコルバージョンのアップグレードの意味については、「Delta Lakeの機能互換性とプロトコル」を参照してください。
Databricks で NOT NULL 制約を設定する
テーブルを作成する際は、スキーマにNOT NULL制約を指定してください。NOT NULL制約を削除または追加するには、 ALTER TABLE ... ALTER COLUMNコマンドを使用します。
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を参照してください。
Databricks で CHECK 制約を設定する
CHECK制約はALTER TABLE ADD CONSTRAINTコマンドとALTER TABLE DROP CONSTRAINTコマンドで管理します。ALTER TABLE ADD CONSTRAINT 、テーブルに制約を追加する前に、既存のすべての行が制約を満たしていることを確認します。
チェック制約には以下の制限が適用されます。
CHECK制約式では、以下の種類の関数を除き、同じ引数値が与えられた場合に常に同じ結果を返すSparkの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 CONSTRAINTとALTER TABLE DROP CONSTRAINTを参照してください。
チェック制約テーブルのプロパティを表示する
テーブルのCHECK制約を表示するには、 DESCRIBE DETAILコマンドとSHOW TBLPROPERTIESコマンドを使用します。
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 以降では一般提供(GA)されています。
一意制約は、Unity Catalog および Delta Lake テーブルの Databricks SQL および Databricks Runtime 18.2 以降でパブリック プレビューとして利用できます。テーブルは複数の一意制約を持つことができます。外部キーは、REFERENCES parent_table(unique_col) を使用して別のテーブルの一意の列を参照できます。一意制約のカラムは、外部キーによってその制約が参照される場合も、NULL許容にできます。一意の列のNULL値は互いに異なるものとして扱われるため、重複するNULL値が一意制約のセマンティクスに違反することはありません。
主キー、外部キー、および一意制約は情報提供のみを目的としており、強制されません。外部キーは、別のテーブルの主キーまたは一意性制約を参照する必要があります。これらの制約は、クエリの最適化によってパフォーマンスを向上させる可能性があります。
information_schemaをクエリするか、DESCRIBE TABLE EXTENDEDまたはSHOW CREATE TABLEを使用して、特定のカタログにわたる制約の適用方法の詳細を取得します。
新しいテーブルに追加
テーブル作成時におけるテーブル仕様句の一部として、主キー、外部キー、および一意制約を宣言する
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ステートメントはこの制約句をサポートしていません。
既存のテーブルに追加する
既存のテーブルに制約を追加するには:
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);