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)されています。
主キーと外部キーは情報提供のみを目的としており、強制力はありません。外部キーは、別のテーブルの主キーを参照する必要があります。情報キー制約は、クエリ最適化によってパフォーマンスを向上させる可能性があります。
information_schemaを照会するか、 DESCRIBEを使用して、特定のカタログ全体に制約がどのように適用されるかの詳細を取得します。
新しいテーブルに追加
テーブル作成時に、テーブル仕様句の一部として主キーと外部キーを宣言します。
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);
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;