適用於:
Databricks SQL
Databricks Runtime
將 資訊性 主鍵、資訊性 外鍵或強制檢查條件約束新增至現有的 Delta Lake 資料表。
ADD [check_constraint | key_constraint ]
check_constraint
CONSTRAINT name CHECK ( condition ) [ ENFORCED ]
key_constraint
{ [ CONSTRAINT name ]
{
PRIMARY KEY ( key_column [ TIMESERIES ] [, ...] ) [ constraint_option [...] ] |
{ FOREIGN KEY (foreign_key_column [, ...] )
REFERENCES parent_table [ ( 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
定義 Delta Lake 資料表的檢查約束條件。
CONSTRAINT
name
指定約束的名稱。
名稱在數據表內必須是唯一的。
如果未提供 FOREIGN KEY
或 PRIMARY KEY
條件約束的名稱,Azure Databricks 系統會自動產生一個名稱。
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 和更新版本
定義 Delta Lake 數據表的 資訊性 主鍵或 資訊性 外鍵條件約束。
CONSTRAINT
name
選擇性地指定條件約束的名稱。
名稱在架構內必須是唯一的。
如果未提供任何名稱,Azure Databricks 將會產生一個名稱。
PRIMARY KEY ( key_column [ TIMESERIES ] [, ...] ) [ constraint_option [...] ]
適用於:
僅限 Unity Catalog
將主鍵條件約束新增至 Delta Lake 數據表。 數據表最多可以有一個主鍵。
hive_metastore
目錄中的數據表不支援主鍵條件約束。
key_column
主旨資料表的欄位,定義為 NOT NULL
。 數據行名稱不得重複。
TIMESERIES
適用於:
Databricks SQL
Databricks Runtime 13.3 LTS 和更新版本
選擇性地將主鍵數據列元件標記為代表時間範圍。
FOREIGN KEY ( foreign_key_column [, ...] ) REFERENCES parent_table [ ( parent_column [, ...] ) ] foreign_key_option
適用於:
僅限 Unity Catalog
將外鍵(引用完整性)條件約束新增至 Delta Lake 數據表。
hive_metastore
目錄中的數據表不支援外鍵條件約束。
foreign_key_column (外鍵列)
主旨表的欄位。 數據行名稱不得重複。
每個數據行的數據類型必須符合相符 parent_column
的類型。
列數必須與 parent_columns
數目對應。
兩個外鍵無法共用一組相同的外鍵數據行。
parent_table
指定外鍵所參考的數據表。
數據表必須具有定義的 PRIMARY KEY
條件約束,而且您必須具有數據表的 SELECT
許可權。
parent_column
父表中的一個欄,屬於其主要鍵的一部分。
父數據表的所有主鍵數據行都必須列出。
如果未列出父欄位,則暗示為以 PRIMARY KEY
定義中指定的順序列出。
不允許僅僅因外鍵欄位排列不同的外鍵約束條件。
constraint_option
列出條件約束的屬性。
所有屬性都是選擇性屬性,但預設為隱含。
每個屬性最多可以指定一次。
NOT ENFORCED
Azure Databricks 不會採取任何動作,針對現有或新的數據列強制執行它。
DEFERRABLE
約束條件的執行可以延遲。
INITIALLY DEFERRED
約束條件的強制執行會被延後。
NORELY
或 RELY
適用於:
Databricks SQL
Databricks Runtime 14.2 和更新版本的條件約束
適用於:
檢查標示為 yes Databricks SQL
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);