ADD CONSTRAINT 子句
適用於:Databricks SQL Databricks Runtime
將 資訊 主鍵、資訊 外鍵或強制檢查 constraint 新增至現有的 Delta Lake table。
語法
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
。
Parameters
check_constraint
定義 Delta Lake table的檢查 constraint。
CONSTRAINT
name為 constraint指定一個名稱。 名稱在 table內必須是唯一的。 如果未提供
FOREIGN KEY
或PRIMARY KEY
constraint的名稱,Azure Databricks 將會 generate 一個。CHECK (
condition)
condition
必須是傳回的BOOLEAN
決定性表達式。condition
可能包含常值、table內的 column 標識符,以及具決定性的內建 SQL 函式或運算符,但除外:- 彙總函數
- 分析 window 函式
- 排名 window 函式
- Table 值產生器函式
condition
也不得包含任何子查詢。若要在 Azure Databricks 中滿足
CHECK
constraint,它必須評估為true
。Delta Lake 會針對新的和現有的數據驗證檢查 constraint 的有效性。 如果有任何現有的數據列違反 constraint 就會引發錯誤。
key_constraint
重要
這項功能處於公開預覽狀態。
適用於: Databricks SQL Databricks Runtime 11.3 LTS 和更新版本
定義 Delta Lake table的 資訊性 主鍵或 資訊性 外鍵 constraint。
CONSTRAINT
name可以選擇性地為 constraint指定名稱。 名稱在 schema內必須是唯一的。 如果未提供任何名稱,Azure Databricks 將會 generate 一個名稱。
PRIMARY KEY ( key_column [ TIMESERIES ] [, ...] ) [ constraint_option [...] ]
適用於: Unity Catalog
將主鍵 constraint 新增至 Delta Lake table。 table 最多只能有一個主鍵。
tables 主鍵條件約束在
hive_metastore
catalog中不受支援。-
主體 table 中被定義為
NOT NULL
的 column。 Column 名稱不得重複。 TIMESERIES
適用於: Databricks SQL Databricks Runtime 13.3 LTS 和更新版本
選擇性地將主鍵 column 元件標示為代表時間序列。
FOREIGN KEY ( foreign_key_column [, ...] ) REFERENCES parent_table [ ( parent_column [, ...] ) ] foreign_key_option
適用於: Unity Catalog
將外鍵(引用完整性)constraint 新增至 Delta Lake table。
在
hive_metastore
catalog中,tables 的外鍵條件約束不受支援。-
主題中的 table的 column。 Column 名稱不得重複。 每個 column 的數據類型必須符合相符
parent_column
的類型。 columns 數目必須符合parent_columns
的數目。 兩個外鍵無法分享相同的外鍵 setcolumns。 -
指定table作為外鍵參考的對象。 table 必須具有定義的
PRIMARY KEY
constraint,而且您必須在 table上具有SELECT
許可權。 -
父 table 中的 column,是其主鍵的一部分。 父 table 的所有主鍵 columns 都必須列出來。
如果未列出父 columns,則會以
PRIMARY KEY
定義中指定的順序來指定。
不允許只有外鍵排列 columns 不同之外鍵條件約束。
-
constraint_option
列出條件約束的屬性。 所有屬性都是選擇性屬性,但預設為隱含。 每個屬性最多可以指定一次。
NOT ENFORCED
Azure Databricks 不會採取任何動作,針對現有或新的數據列強制執行它。
DEFERRABLE
constraint 強制執行可以延期。
INITIALLY DEFERRED
Constraint 執行被延後。
NORELY
或RELY
適用於:適用於條件約束的 Databricks SQL
PRIMARY KEY
Databricks Runtime 14.2 和更新版本適用於:檢查標示為 yes Databricks SQL Databricks Runtime 15.4 和更新版本,針對
FOREIGN KEY
條件約束如果
RELY
,Azure Databricks 可能會利用 constraint 來重寫查詢。 用戶有責任確保 constraint 被滿足。 依賴一個不符合條件的 constraint 可能會導致查詢結果不正確。預設值為
NORELY
。
foreign_key_option
列出外鍵條件約束特有的屬性。 所有屬性都是選擇性屬性,但預設為隱含。 每個屬性最多可以指定一次。
MATCH FULL
若要將 constraint 視為 true,所有 columnvalues 都必須
NOT NULL
。ON UPDATE NO ACTION
如果更新父
PRIMARY KEY
Azure Databricks 不會採取任何動作來限制 update 或 update 外鍵。ON DELETE NO ACTION
如果刪除父數據列,Azure Databricks 不會採取任何動作來限制動作、update 外鍵或刪除相依數據列。
重要
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);