共用方式為


ADD CONSTRAINT 子句

適用於:標記為「是」Databricks SQL 標記為「是」Databricks Runtime

資訊性 主鍵、資訊性 外鍵,或強制性檢查約束新增至現有的 Delta Lake 資料表。

語法

ADD [check_constraint | key_constraint ]

check_constraint
    CONSTRAINT name CHECK ( condition )

key_constraint
    { [ CONSTRAINT name ]
      {
        PRIMARY KEY ( key_column [ TIMESERIES ] [, ...] ) [ constraint_option [...] ] |
        { FOREIGN KEY (foreign_key_column [, ...] )
          REFERENCES parent_relation [ ( parent_column [, ...] ] )
          [ constraint_option | foreign_key_option ] [...]
      }
    }

constraint_option
    { NOT ENFORCED |
      DEFERRABLE |
      INITIALLY DEFERRED |
      { NORELY | RELY } }

foreign_key_option
    { MATCH FULL |
      ON UPDATE NO ACTION |
      ON DELETE NO ACTION }

若要與非標準 SQL 方言相容,您可以指定 ENABLE NOVALIDATE 而不是 NOT ENFORCED DEFERRABLE INITIALLY DEFERRED

參數

  • check_constraint

    定義關係的檢查約束條件。

    • CONSTRAINT 名字

      指定約束的名稱。 名稱在關聯內必須是唯一的。

    • CHECK ( 條件)

      在加入條件約束時,關聯的DEFAULT COLLATION必須在UTF8_BINARY

      condition 必須是傳回的 BOOLEAN決定性表達式。

      condition 可能包含常值、關聯內的數據行標識符,以及決定性的內建 SQL 函數或運算符,但除外:

      condition 也不得包含任何子查詢

      若要在 Azure Databricks 中滿足 CHECK 約束條件,它必須評估為 true

      Delta Lake 會針對新的和現有的數據驗證檢查條件約束的有效性。 如果有任何現有的數據列違反條件約束,就會引發錯誤。

  • key_constraint

    重要

    這項功能處於公開預覽狀態

    適用於:核取記號為「是」 Databricks SQL 核取記號為「是」 Databricks Runtime 11.3 LTS 和更新版本

    定義資訊性主鍵或資訊性外鍵條件約束。 不會強制執行資訊索引鍵條件約束,但可藉由支援 查詢優化來改善效能。

    • CONSTRAINT 名字

      選擇性地指定條件約束的名稱。 名稱在架構內必須是唯一的。 如果未提供任何名稱,Azure Databricks 將會產生一個名稱。

    • PRIMARY KEY ( key_column [ TIMESERIES ] [, ...] ) [ constraint_option [...] ]

      適用於:標記為「是」 僅限 Unity Catalog

      將主鍵約束添加到關係中。 關聯最多可以有一個主鍵。

      hive_metastore 目錄中的關係不支援主鍵約束。

    • key_column

      定義為NOT NULL的主體關聯的數據行。 數據行名稱不得重複。

    • TIMESERIES

      適用於:勾選為「是」 Databricks SQL 勾選為「是」 Databricks Runtime 13.3 LTS 和更新版本

      選擇性地將主鍵數據列元件標記為代表時間範圍。

    • FOREIGN KEY ( foreign_key_column [, ...] ) REFERENCES parent_relation [ ( parent_column [, ...] ) ] foreign_key_option

      適用於:標記為「是」 僅限 Unity Catalog

      將外鍵(引用完整性)條件約束加入至關聯。

      hive_metastore 目錄中的關聯不支援外鍵約束。

      • 外鍵欄位

        主題關聯性的欄位。 數據行名稱不得重複。 每個數據行的數據類型必須符合相符 parent_column的類型。 列數必須與 parent_columns數目對應。 兩個外鍵無法共用一組相同的外鍵數據行。

      • parent_relation

        指定外鍵所參考的關係。 關聯性必須具有已定義的 PRIMARY KEY 條件約束,而且您必須具有 SELECT 關聯性的許可權。

      • parent_column

        在父關係中作為其主鍵一部分的欄位。 父關聯的所有主鍵欄位都必須列出。

        如果未列出父欄位,則暗示為以 PRIMARY KEY 定義中指定的順序列出。

      不允許僅僅因外鍵欄位排列不同的外鍵約束條件。

    • constraint_option

      列出條件約束的屬性。 所有屬性都是選擇性的,但預設為隱含。 每個屬性最多可以指定一次。

      • NOT ENFORCED

        Azure Databricks 不會採取任何動作,針對現有或新的數據列強制執行它。

      • DEFERRABLE

        約束條件的執行可以延遲。

      • INITIALLY DEFERRED

        約束條件的強制執行會被延後。

      • NORELYRELY

        適用於:核取記號為是 Databricks SQL 核取記號為是 Databricks Runtime 14.2 和更新版本的PRIMARY KEY條件約束

        適用於:檢查標示為 yes Databricks SQL 檢查標示為 yes Databricks Runtime 15.4 和更新版本,針對 FOREIGN KEY 條件約束

        如果 RELY,Azure Databricks 可能會利用條件約束來重寫查詢。 用戶有責任確保滿足條件約束。 依賴不符合的條件約束可能會導致查詢結果不正確。

        預設值為 NORELY

    • foreign_key_option

      列出特定於外鍵約束的屬性。 所有屬性都是選擇性的,但預設為隱含。 每個屬性最多可以指定一次。

      • MATCH FULL

        若要將限制視為 true,所有資料行值都必須為 NOT NULL

      • ON UPDATE NO ACTION

        當父 PRIMARY KEY 被更新時,Azure Databricks 不會採取行動來限制此更新或更新外鍵。

      • ON DELETE NO ACTION

        如果刪除父數據列,Azure Databricks 不會採取任何動作來限制動作、更新外鍵或刪除相依數據列。

重要

Azure Databricks 不會強制執行主鍵或外鍵條件約束。 新增主鍵或外鍵之前,請先確認鍵值約束。 您的擷取程式可能會提供這類保證,或者您可以針對您的資料執行檢查。

範例

-- Add a primary key
> CREATE TABLE persons(first_name STRING NOT NULL, last_name STRING NOT NULL, nickname STRING);
> ALTER TABLE persons ADD CONSTRAINT persons_pk PRIMARY KEY(first_name, last_name);

-- Add a foreign key which Databricks does not enforce, but can rely upon.
> CREATE TABLE pets(name STRING, owner_first_name STRING, owner_last_name STRING);
> ALTER TABLE pets ADD CONSTRAINT pets_persons_fk
    FOREIGN KEY(owner_first_name, owner_last_name) REFERENCES persons
    NOT ENFORCED RELY;

-- Add a check contraint
> ALTER TABLE pets ADD CONSTRAINT pets_name_not_cute_chk CHECK (length(name) < 20);