CONSTRAINT 子句
適用於:Databricks SQL
Databricks Runtime
將資訊主鍵或資訊外鍵新增為 CREATE TABLE 或 CREATE 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
目錄中的數據表不支援主鍵條件約束。-
主題表或具體化檢視的欄。 數據行名稱不得重複。
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
的數目一致。 兩個外鍵無法共用一組相同的外鍵數據行。 -
指定外鍵所參考的數據表或具體化檢視。 數據表必須具有定義的
PRIMARY KEY
條件約束,而且您必須具有數據表的SELECT
許可權。 -
父數據表或具現化檢視中的數據列,屬於其主鍵的一部分。 父數據表或具體化檢視表的所有主鍵數據行都必須列出。
如果未列出父數據行,則會依照
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
約束條件的強制執行會被延後。
NORELY
或RELY
適用於:
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);