Azure Databricks支持标准 SQL 约束管理子句:
- 强制约束在向表添加行之前验证数据完整性。
- 信息性主键和外键约束定义表中字段之间的关系,但不强制实施。
Azure Databricks 上的所有约束都需要 Delta Lake。
有关 Lakeflow Spark 声明式管道中相关概念的信息,请参阅 使用管道期望管理数据质量。
对 Azure Databricks 的强制约束
当违反约束时,事务将失败并出现错误。 Azure Databricks支持两种类型的约束:
-
NOT NULL:指示特定列中的值不能为 null。 -
CHECK:指示每个输入行的指定的布尔表达式必须为 true。
重要
添加约束时,如果以前的编写器版本小于 3,Azure Databricks会自动升级表编写器协议版本。 请参阅 Delta Lake 功能兼容性和协议 ,了解表协议版本控制以及升级协议版本的含义。
在 Azure Databricks 中设置 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。
在 Azure Databricks 中设置 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。
主键和外键只是信息性的,不会强制执行。 外键必须引用另一个表中的主键。 信息性关键约束可能会通过 查询优化来提高性能。
查询information_schema或使用DESCRIBE获取有关如何在给定目录中应用约束的详细信息。
添加到新表
在创建表期间将主键和外键声明为表规范子句的一部分:
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);
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;