Azure Databricks 中的條件約束

Azure Databricks 支援標準的 SQL 限制管理子句:

  • 強制限制會在新增資料列前驗證資料完整性。
  • 資訊限制(主鍵、外鍵及唯一限制)定義資料表欄位間的關係,且不強制執行。

Azure Databricks 上的所有限制都必須依賴 Delta Lake。

關於 Lakeflow 管線中的相關概念,請參見 「以管線期望管理資料品質」。

強制執行的限制條件

違反條件約束時,交易會失敗並出現錯誤。 Azure Databricks 支援兩種類型的限制:

  • NOT NULL:表示特定數據行中的值不可以是 null。
  • CHECK:表示每個輸入數據列的指定布爾表達式必須為 true。

Note

若目前的寫入器版本小於 3,新增限制條件會將資料表寫入器通訊協定升級。 這可能會影響與外部 Delta Lake 用戶端的相容性。 請參閱 Delta Lake 功能相容性和通訊協定。

NOT NULL 條件約束

當你建立資料表時,請在結構中指定 NOT NULL 限制條件。 建立後要刪除或新增 NOT NULL 約束,請使用指令 ALTER TABLE ... ALTER COLUMN 。 以下範例建立一個 people_demo 表格,本節其餘部分會重複使用:

CREATE OR REPLACE TABLE main.default.people_demo (
  id INT NOT NULL,
  firstName STRING,
  middleName STRING NOT NULL,
  lastName STRING,
  gender STRING,
  birthDate TIMESTAMP,
  ssn STRING,
  salary INT
);

ALTER TABLE main.default.people_demo ALTER COLUMN middleName DROP NOT NULL;
ALTER TABLE main.default.people_demo ALTER COLUMN ssn SET NOT NULL;

Azure Databricks 在向資料表加入 NOT NULL 約束前,驗證所有現有列都符合該限制。

如果您在結構內巢狀數據行上指定 NOT NULL 條件約束,父結構也必須不是 Null。 在陣列或映射類型中巢狀的欄位不接受 NOT NULL 約束。

請參閱 CREATE TABLE [USING] 和 ALTER TABLE ALTER COLUMN。

CHECK 條件約束

用 CHECK and ALTER TABLE ADD CONSTRAINT 指令管理ALTER TABLE DROP CONSTRAINT限制。 ALTER TABLE ADD CONSTRAINT 驗證所有現有列都滿足該限制,然後才將該限制加入表格。

以下限制適用於檢查約束條件:

  • CHECK限制表達式可以使用 Spark 中任何在相同參數值下總是回傳相同結果的 SQL 函式,但以下類型的函式除外:
    • 用戶定義函式。
    • 聚合函數。
    • 窗函數。
    • 傳回多個數據列的函式。

新增到現有表格

以下範例將 CHECK 限制加入 people_demo 前一節建立的表格,然後將其刪除:

ALTER TABLE main.default.people_demo ADD CONSTRAINT dateWithinRange CHECK (birthDate > '1900-01-01');
ALTER TABLE main.default.people_demo DROP CONSTRAINT dateWithinRange;

請參閱 ALTER TABLE ADD CONSTRAINT 與 ALTER TABLE DROP CONSTRAINT。

檢視檢查制約表的屬性

使用 DESCRIBE DETAIL and SHOW TBLPROPERTIES 指令來查看資料表的 CHECK 限制條件。 以下範例會將一個限制條件加入至 people_demo,然後將其顯示出來:

ALTER TABLE main.default.people_demo ADD CONSTRAINT validIds CHECK (id > 1 and id < 99999999);

DESCRIBE DETAIL main.default.people_demo;

SHOW TBLPROPERTIES main.default.people_demo;

移除檢查約束

在 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 值彼此會被視為不同。

查詢 information_schema、使用 DESCRIBE TABLE EXTENDED,或使用 SHOW CREATE TABLE,以取得約束條件如何套用至指定目錄中的詳細資訊。

新增至新資料表

在建立表格時,宣告主鍵、外鍵及唯一約束,作為表格規範條款的一部分:

CREATE OR REPLACE TABLE main.default.T(pk1 INTEGER NOT NULL, pk2 INTEGER NOT NULL,
                CONSTRAINT t_pk PRIMARY KEY(pk1, pk2));
CREATE OR REPLACE TABLE main.default.S(pk INTEGER NOT NULL PRIMARY KEY,
                fk1 INTEGER, fk2 INTEGER,
                CONSTRAINT s_t_fk FOREIGN KEY(fk1, fk2) REFERENCES main.default.T);
CREATE OR REPLACE TABLE main.default.U(id INTEGER NOT NULL, email STRING NOT NULL,
                CONSTRAINT u_uq_email UNIQUE(email));

CTAS 陳述不支援此限制條款。

新增到現有資料表

或者,也可以將相同的限制加到已存在的資料表上。 此方法得出與前一節相同的結果。 以下範例會在不加任何限制條件的情況下重新建立 T、S 與 U,然後使用 ALTER TABLE ADD CONSTRAINT 加入各個限制條件。 在引用該主鍵的外鍵前加入一個主鍵:

CREATE OR REPLACE TABLE main.default.T(pk1 INTEGER NOT NULL, pk2 INTEGER NOT NULL);
CREATE OR REPLACE TABLE main.default.S(pk INTEGER NOT NULL, fk1 INTEGER, fk2 INTEGER);
CREATE OR REPLACE TABLE main.default.U(id INTEGER NOT NULL, email STRING NOT NULL);

ALTER TABLE main.default.T ADD CONSTRAINT t_pk PRIMARY KEY(pk1, pk2);
ALTER TABLE main.default.S ADD CONSTRAINT s_t_fk FOREIGN KEY(fk1, fk2) REFERENCES main.default.T;
ALTER TABLE main.default.U ADD CONSTRAINT u_uq_email UNIQUE(email);

其他資源