Azure Databricks支持标准 SQL 约束管理子句:
- 强制约束在向表添加行之前验证数据完整性。
- 信息性约束(主键、外键和唯一约束)定义表中字段之间的关系,但不强制实施。
Azure Databricks 上的所有约束都需要 Delta Lake。
有关 Lakeflow 管道中的相关概念,请参阅 使用管道期望管理数据质量。
强制约束
当违反约束时,事务将失败并出现错误。 Azure Databricks支持两种类型的约束:
-
NOT NULL:指示特定列中的值不能为 null。 -
CHECK:指示每个输入行的指定的布尔表达式必须为 true。
Note
如果当前编写器版本小于 3,则添加约束会升级表编写器协议。 这可能会影响与外部 Delta Lake 客户端的兼容性。 请参阅 Delta Lake 功能兼容性和协议。
NOT NULL 约束
创建表时,请在架构中指定 NOT NULL 约束。 若要删除或添加 NOT NULL 约束,请使用 ALTER TABLE ... ALTER COLUMN 以下命令:
CREATE TABLE people10m (
id INT NOT NULL,
firstName STRING,
middleName STRING NOT NULL,
lastName STRING,
gender STRING,
birthDate TIMESTAMP,
ssn STRING,
salary INT
);
ALTER TABLE people10m ALTER COLUMN middleName DROP NOT NULL;
ALTER TABLE people10m ALTER COLUMN ssn SET NOT NULL;
Azure Databricks在向表添加 NOT NULL 约束之前验证所有现有行是否满足约束。
如果在结构中嵌套的列上指定了 NOT NULL 约束,则父结构也必须不为 null。 嵌套在数组或映射类型的列不接受 NOT NULL 约束。
请参阅 CREATE TABLE [USING] 和 ALTER TABLE ALTER COLUMN。
CHECK 约束
使用CHECK和ALTER TABLE ADD CONSTRAINT命令管理ALTER TABLE DROP CONSTRAINT约束。
ALTER TABLE ADD CONSTRAINT 在将约束添加到表之前,验证所有现有行是否满足约束。
以下限制适用于检查约束:
-
CHECK约束表达式可以使用 Spark 中的任何 SQL 函数,当给定相同的参数值时,始终返回相同的结果,但以下类型的函数除外:- 用户定义的函数。
- 聚合函数。
- 窗口函数。
- 返回多行的函数。
添加到现有表
CREATE TABLE people10m (
id INT,
firstName STRING,
middleName STRING,
lastName STRING,
gender STRING,
birthDate TIMESTAMP,
ssn STRING,
salary INT
);
ALTER TABLE people10m ADD CONSTRAINT dateWithinRange CHECK (birthDate > '1900-01-01');
ALTER TABLE people10m DROP CONSTRAINT dateWithinRange;
请参阅 ALTER TABLE ADD CONSTRAINT 和 ALTER TABLE DROP CONSTRAINT。
查看检查约束表属性
使用DESCRIBE DETAIL和SHOW TBLPROPERTIES命令查看表CHECK的约束。
ALTER TABLE people10m ADD CONSTRAINT validIds CHECK (id > 1 and id < 99999999);
DESCRIBE DETAIL people10m;
SHOW TBLPROPERTIES people10m;
删除检查约束
在 Databricks Runtime 15.4 LTS 及更高版本中,使用 DROP FEATURE 命令从表中删除检查约束并降级表协议。
声明主键、外键和唯一约束
主键、外键和唯一约束只是信息性的,不会强制执行。 它们可以通过 查询优化来提高性能。
- 主键和外键:适用于 Databricks Runtime 13.3 LTS 及更高版本中的 Unity 目录和 Delta Lake 表。 Databricks Runtime 15.2 及更高版本中的 GA。 外键必须引用另一个表中的主键或唯一约束。
-
唯一:在 Databricks SQL 和 Databricks Runtime 18.2 及更高版本的 Unity 目录和 Delta Lake 表的公共预览版中提供。 表可以具有多个唯一约束。 外键可以使用
REFERENCES parent_table(unique_col)引用唯一列。 唯一列可以为 null,因为NULL值被视为彼此不同的值。
查询 information_schema,使用 DESCRIBE TABLE EXTENDED 或 SHOW CREATE TABLE,以获取有关约束如何在给定目录中应用的详细信息。
添加到新表
在创建表期间,将主键、外键和唯一约束声明为表规范子句的一部分:
CREATE TABLE T(pk1 INTEGER NOT NULL, pk2 INTEGER NOT NULL,
CONSTRAINT t_pk PRIMARY KEY(pk1, pk2));
CREATE TABLE S(pk INTEGER NOT NULL PRIMARY KEY,
fk1 INTEGER, fk2 INTEGER,
CONSTRAINT s_t_fk FOREIGN KEY(fk1, fk2) REFERENCES T);
CREATE TABLE U(id INTEGER NOT NULL, email STRING NOT NULL,
CONSTRAINT u_uq_email UNIQUE(email));
CTAS 语句不支持此约束子句。
添加到现有表
向现有表添加约束:
ALTER TABLE T ADD CONSTRAINT t_pk PRIMARY KEY(pk1, pk2);
ALTER TABLE S ADD CONSTRAINT s_t_fk FOREIGN KEY(fk1, fk2) REFERENCES T;
ALTER TABLE U ADD CONSTRAINT u_uq_email UNIQUE(email);