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コマンドを使用します。
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関数を使用できます。- ユーザー定義関数
- 集計関数
- ウィンドウ関数
- 複数の行を返す関数
既存のテーブルに追加する
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 以降で一般提供されます。外部キーは、別のテーブル内のプライマリキーまたは一意制約を参照する必要があります。
- 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を使用して、特定のカタログにわたる制約の適用方法の詳細を取得します。
新しいテーブルに追加
テーブル作成時におけるテーブル仕様句の一部として、主キー、外部キー、および一意制約を宣言する
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);