CONSTRAINT 子句
適用於:Databricks SQL
Databricks Runtime
將資訊主鍵或資訊外鍵新增為 CREATE TABLE 或 CREATE MATERIALIZED VIEW 語句的一部分。
若要在建立 table 之後,將檢查 constraint 新增至 Delta Lake table,請使用 ALTER TABLE。
語法
使用 table_constraint
子句來定義跨越多個 columns 的條件約束,或將語法與 column 定義分開。
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 定義的條件約束。
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
。
Parameters
CONSTRAINT
name選擇性地指定 constraint的名稱。 名稱在 schema內必須是唯一的。 如果未提供任何名稱,Azure Databricks 將會 generate 一個名稱。
PRIMARY KEY
(key_column [ TIMESERIES ] [, ...] )[ constraint_option [...] ]適用於:
Databricks SQL
Databricks Runtime 11.3 LTS 和更新版本
Unity Catalog 只有
將資訊性的主鍵 constraint 加入至 table 或具體化檢視。 table 或具體化視圖最多可以有一個主鍵。
主鍵 columns 會隱含定義為
NOT NULL
。tables 在
hive_metastore
catalog中不支援主鍵條件約束。-
主題 table 或具體化檢視的 column。 Column 名稱不得重複。
TIMESERIES
適用於:
Databricks SQL
Databricks Runtime 13.3 LTS 和更新版本
可選地將主鍵 column 元件標示為代表時間序列。
-
PRIMARY KEY [ constraint_option ] [...]
使用前面鍵 column 定義,將單一 column 主鍵 constraint 新增至 table 或具體化檢視。
這
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
將參考外鍵(引用完整性)constraint 新增至 table 或具體化檢視。
hive_metastore
catalog不支援 tables 外鍵條件約束。不允許只在外鍵排列 columns 上有所不同的外鍵約束。
-
主題 column 或具體化檢視的 table。 Column 名稱不得重複。 每個 column 的數據類型必須符合相符
parent_column
的類型。 columns 的數目必須與parent_column
的數目相符。 兩個外鍵無法分享相同的外鍵 setcolumns。 -
指定外鍵所參考的 table 或具象化檢視。 table 必須具有定義的
PRIMARY KEY
constraint,而且您必須具有 table的SELECT
許可權。 -
在父 table 或具體化檢視中的 column,是其主鍵的一部分。 父項目 table 或具體化檢視的所有主鍵 columns 都必須列出。
如果未列出父 columns,則會依照
PRIMARY KEY
定義中指定的順序來指定它們。 FOREIGN KEY REFERENCES parent_table [ ( parent_column ) ] foreign_key_option
使用上述外鍵 column 定義,將單一 column 外鍵 constraint 新增至 table 或具體化檢視。
這
column_constraint
相當於table_constraint
FOREIGN KEY ( foreign_key_column ) REFERENCES parent_table [ ( parent_column ) ] foreign_key_option
-
constraint_option
列出條件約束的屬性。 所有屬性都是選擇性屬性,但預設為隱含。 每個屬性最多可以指定一次。
NOT ENFORCED
Azure Databricks 不會採取任何動作,針對現有或新的數據列強制執行它。
DEFERRABLE
constraint 強制執行可以延後。
INITIALLY DEFERRED
Constraint 執行將被延後。
NORELY
或RELY
適用於:
適用於條件約束的
Databricks SQL
PRIMARY KEY
Databricks Runtime 14.2 和更新版本適用於:
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 不會強制執行主鍵或外鍵條件約束。 新增主鍵或外鍵之前,請先確認索引鍵條件約束。 您的擷取程式可能會提供這類保證,或者您可以針對您的資料執行檢查。
範例
-- 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);