共用方式為


CONSTRAINT 子句

適用於:勾選「是」Databricks SQL 勾選「是」Databricks Runtime

將資訊主鍵或資訊外鍵新增為 CREATE TABLECREATE MATERIALIZED VIEW 語句的一部分。

若要將檢查條件約束新增至 Delta Lake 數據表,請在建立數據表之後使用 ALTER TABLE

語法

使用 table_constraint 子句來定義跨越多個數據行的條件約束,或將語法與數據行定義分開。

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

使用 column_constraint子句來定義單一數據行定義特有的條件約束。

column_constraint
  { [ CONSTRAINT name ]
    { PRIMARY KEY [ constraint_option ] [...] |
      { [ FOREIGN KEY ]
        REFERENCES parent_table [ ( parent_column [, ...] ) ]
        [ foreign_key_option | constraint_option ] [...]
      }
    }
  }
constraint_option
    { NOT ENFORCED |
      DEFERRABLE |
      INITIALLY DEFERRED |
      { RELY | NORELY } }

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

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

參數

  • CONSTRAINT name

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

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

    適用於:檢查標示為「是」 Databricks SQL 檢查標示為「是」 Databricks Runtime 11.3 LTS 和更新版本,檢查標示為「是」 Unity Catalog 只有

    將資訊性主鍵約束條件加入至數據表或實體化檢視。 數據表或實體化檢視最多可以有一個主鍵。

    主鍵資料行會隱含定義為 NOT NULL

    hive_metastore 目錄中的數據表不支援主鍵條件約束。

    • key_column

      主題表或具體化檢視的欄。 數據行名稱不得重複。

    • TIMESERIES

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

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

  • PRIMARY KEY [ constraint_option ] [...]

    使用上述鍵欄位定義,將單一欄位主鍵約束加入至資料表或具現化檢視表。

    column_constraint 相當於 table_constraint

    PRIMARY KEY (key_column) [ constraint_option ] [...]

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

    適用於:檢查標示為「是」 Databricks SQL 檢查標示為「是」 Databricks Runtime 11.3 LTS 和更新版本,檢查標示為「是」 Unity Catalog 只有

    將資訊外鍵(引用完整性)條件約束加入至數據表或實體化檢視。

    hive_metastore 目錄中的數據表不支援外鍵條件約束。

    不允許只有外鍵列排列不同的外鍵約束。

    • 外鍵欄位

      主題表或具體化檢視的欄。 數據行名稱不得重複。 每個數據行的數據類型必須符合相符 parent_column的類型。 欄位數目必須與 parent_column的數目一致。 兩個外鍵無法共用一組相同的外鍵數據行。

    • parent_table

      指定外鍵所參考的數據表或具體化檢視。 數據表必須具有定義的 PRIMARY KEY 條件約束,而且您必須具有數據表的 SELECT 許可權。

    • parent_column

      父數據表或具現化檢視中的數據列,屬於其主鍵的一部分。 父數據表或具體化檢視表的所有主鍵數據行都必須列出。

      如果未列出父數據行,則會依照 PRIMARY KEY 定義中指定的順序來指定它們。

    • FOREIGN KEY REFERENCES parent_table [ ( parent_column ) ] foreign_key_option

      使用上述外鍵欄位定義,將單欄外鍵限制加入資料表或實體化視圖。

      column_constraint 相當於 table_constraint

      FOREIGN KEY ( foreign_key_column ) REFERENCES parent_table [ ( parent_column ) ] foreign_key_option

  • constraint_option

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

    • NOT ENFORCED

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

    • DEFERRABLE

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

    • INITIALLY DEFERRED

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

    • NORELYRELY

      適用於:核取記號為「是」 Databricks SQL 核取記號為「是」 Databricks Runtime 14.2 和更新版本,適用於條件約束

      適用於:標註核取記號為「是」 Databricks SQL 標註核取記號為「是」 Databricks Runtime 15.4 和更新版本,針對 FOREIGN KEY 條件約束

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

      預設值為 NORELY

  • 外鍵選項

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

    • MATCH FULL

      若要將約束條件視為 true,所有資料行值都必須是 NOT NULL

    • ON UPDATE NO ACTION

      如果更新父 PRIMARY KEY,Azure Databricks 不會採取任何動作來限制更新,也不會更新外鍵。

    • ON DELETE NO ACTION

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

重要

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

範例

-- Create a table with a primary key
> CREATE TABLE persons(first_name STRING NOT NULL, last_name STRING NOT NULL, nickname STRING,
                       CONSTRAINT persons_pk PRIMARY KEY(first_name, last_name));

-- create a table with a foreign key
> CREATE TABLE pets(name STRING, owner_first_name STRING, owner_last_name STRING,
                    CONSTRAINT pets_persons_fk FOREIGN KEY (owner_first_name, owner_last_name) REFERENCES persons);

-- Create a table with a single column primary key and system generated name
> CREATE TABLE customers(customerid STRING NOT NULL PRIMARY KEY, name STRING);

-- Create a table with a names single column primary key and a named single column foreign key
> CREATE TABLE orders(orderid BIGINT NOT NULL CONSTRAINT orders_pk PRIMARY KEY,
                      customerid STRING CONSTRAINT orders_customers_fk REFERENCES customers);