Azure Databricks の制約

Azure Databricksでは、標準の SQL 制約管理句がサポートされています。

  • 強制制約は、テーブルに行を追加する前にデータの整合性を確認します。
  • 情報主キー制約と外部キー制約は、テーブル内のフィールド間のリレーションシップを定義し、適用されません。

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

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

Azure Databricksに対する強制的な制約

制約に違反すると、トランザクションはエラーで失敗します。 Azure Databricksでは、次の 2 種類の制約がサポートされています。

  • NOT NULL: 特定の列の値を null にできないことを示します。
  • CHECK: 入力行ごとに指定されたブール式が true でなければならないことを示します。

重要

制約を追加すると、Azure Databricks以前のライター バージョンが 3 未満の場合、テーブル ライター プロトコルバージョンが自動的にアップグレードされます。 テーブル プロトコルのバージョン管理と、プロトコル バージョンをアップグレードする意味については、 Delta Lake の機能の互換性とプロトコル に関する記事を参照してください。

Azure 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;

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

構造体内に入れ子になった列に NOT NULL 制約を指定する場合、親構造体も null にすることはできません。 配列またはマップ型内で入れ子になった列は、 NOT NULL 制約を受け入れられません。

CREATE TABLE [USING]」と ALTER TABLE の ALTER COLUMN に関する説明をご覧ください。

Azure Databricks で CHECK 制約を設定する

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

CHECK 制約には、次の制限が適用されます。

  • 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 CONSTRAINTALTER TABLE DROP CONSTRAINTを参照してください。

check 制約テーブルのプロパティを表示する

DESCRIBE DETAILコマンドとSHOW TBLPROPERTIES コマンドを使用して、テーブルのCHECK制約を確認します。

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 コマンドを使用して、テーブルから check 制約を削除し、テーブル プロトコルをダウングレードします。

Delta Lake テーブル機能の削除とテーブル プロトコルのダウングレードに関する記事を参照してください。

主キーと外部キーのリレーションシップを宣言する

主キー制約と外部キー制約は、Databricks Runtime 13.3 LTS 以降の Unity カタログ テーブルと 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;