ADD CONSTRAINT 子句
適用於: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 (
condition)
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
目錄中的數據表不支援主鍵條件約束。-
主旨資料表的欄位,定義為
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
目錄中的資料表不支援外鍵約束。-
主旨表的欄位。 數據行名稱不得重複。 每個數據行的數據類型必須符合相符
parent_column
的類型。 列數必須與parent_columns
數目對應。 兩個外鍵無法共用一組相同的外鍵數據行。 -
指定外鍵所參考的數據表。 數據表必須具有定義的
PRIMARY KEY
條件約束,而且您必須具有數據表的SELECT
許可權。 -
父表中的一個欄,屬於其主要鍵的一部分。 父數據表的所有主鍵數據行都必須列出。
如果未列出父欄位,則暗示為以
PRIMARY KEY
定義中指定的順序列出。
不允許僅僅因外鍵欄位排列不同的外鍵約束條件。
-
constraint_option
列出條件約束的屬性。 所有屬性都是選擇性屬性,但預設為隱含。 每個屬性最多可以指定一次。
NOT ENFORCED
Azure Databricks 不會採取任何動作,針對現有或新的數據列強制執行它。
DEFERRABLE
約束條件的執行可以延遲。
INITIALLY DEFERRED
約束強制執行會延遲。
NORELY
或RELY
適用於:
適用於條件約束的
Databricks SQL
PRIMARY KEY
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);