Azure Databricksでは、標準の SQL 制約管理句がサポートされています。
- 強制制約は、テーブルに行を追加する前にデータの整合性を確認します。
- 情報制約 (主キー、外部キー、および一意の制約) は、テーブル内のフィールド間のリレーションシップを定義し、適用されません。
Azure Databricks のすべての制約には Delta Lake が必要です。
Lakeflow パイプラインの関連概念については、パイプラインの 期待に応えたデータ品質の管理に関するページを参照してください。
強制された制約
制約に違反すると、トランザクションはエラーで失敗します。 Azure Databricksでは、次の 2 種類の制約がサポートされています。
-
NOT NULL: 特定の列の値を null にできないことを示します。 -
CHECK: 入力行ごとに指定されたブール式が true でなければならないことを示します。
Note
制約を追加すると、現在のライター バージョンが 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;
Azure 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 制約には、次の制限が適用されます。
-
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 コマンドを使用して、テーブルの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。 外部キーは、別のテーブルの主キーまたは一意制約を参照する必要があります。
-
一意: Databricks SQL および Databricks Runtime 18.2 以降の Unity カタログテーブルと Delta Lake テーブルのパブリック プレビューで使用できます。 1 つのテーブルに複数の一意の制約を設定できます。 外部キーは、
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);