Restricciones en Azure Databricks

Azure Databricks admite cláusulas de administración de restricciones SQL estándar:

  • Las restricciones aplicadas comprueban la integridad de los datos antes de agregar filas a una tabla.
  • Las restricciones informativas (clave principal, clave externa y restricciones únicas) definen las relaciones entre los campos de las tablas y no se aplican.

Todas las restricciones de Azure Databricks requieren Delta Lake.

Para obtener un concepto relacionado en canalizaciones de Lakeflow, consulte Administración de la calidad de los datos con las expectativas de canalización.

Restricciones aplicadas

Cuando se infringe una restricción, se produce un error en la transacción. Azure Databricks admite dos tipos de restricciones:

  • NOT NULL: indica que los valores de columnas específicas no pueden ser NULL.
  • CHECK: indica que una expresión booleana especificada debe ser true para cada fila de entrada.

Note

Al agregar una restricción, se actualiza el protocolo de escritura de tablas si la versión del escritor actual es inferior a 3. Esto puede afectar a la compatibilidad con clientes externos de Delta Lake. Consulte Compatibilidad y protocolos de características de Delta Lake.

Restricción NOT NULL

Al crear una tabla, especifique NOT NULL restricciones en el esquema. Para eliminar o añadir NOT NULL restricciones tras la creación, usa el ALTER TABLE ... ALTER COLUMN comando. El siguiente ejemplo crea una people_demo tabla que el resto de esta sección reutiliza:

CREATE OR REPLACE TABLE main.default.people_demo (
  id INT NOT NULL,
  firstName STRING,
  middleName STRING NOT NULL,
  lastName STRING,
  gender STRING,
  birthDate TIMESTAMP,
  ssn STRING,
  salary INT
);

ALTER TABLE main.default.people_demo ALTER COLUMN middleName DROP NOT NULL;
ALTER TABLE main.default.people_demo ALTER COLUMN ssn SET NOT NULL;

Azure Databricks comprueba que todas las filas existentes cumplen la restricción antes de agregar una restricción NOT NULL a una tabla.

Si especifica una restricción NOT NULL en una columna anidada dentro de una estructura, la estructura primaria no debe ser null. Las columnas anidadas en tipos de mapas o matrices no aceptan restricciones NOT NULL.

Vea CREATE TABLE [USING] y ALTER TABLE ALTER COLUMN.

Restricción CHECK

Administrar CHECK restricciones con los comandos ALTER TABLE ADD CONSTRAINT y ALTER TABLE DROP CONSTRAINT. ALTER TABLE ADD CONSTRAINT comprueba que todas las filas existentes cumplen la restricción antes de agregar la restricción a la tabla.

Las siguientes restricciones se aplican a las restricciones de comprobación:

  • Una CHECK expresión de restricción puede usar cualquier función SQL de Spark que siempre devuelva el mismo resultado cuando se proporcionan los mismos valores de argumento, excepto los siguientes tipos de funciones:
    • Funciones definidas por el usuario.
    • Funciones de agregado.
    • Funciones de ventana.
    • Funciones que devuelven varias filas.

Agregar a una tabla existente

El siguiente ejemplo añade una CHECK restricción a la people_demo tabla creada en la sección anterior y luego la elimina:

ALTER TABLE main.default.people_demo ADD CONSTRAINT dateWithinRange CHECK (birthDate > '1900-01-01');
ALTER TABLE main.default.people_demo DROP CONSTRAINT dateWithinRange;

Consulte ALTER TABLE ADD CONSTRAINT y ALTER TABLE DROP CONSTRAINT.

Ver propiedades de la tabla de restricciones de verificación

Use los DESCRIBE DETAIL comandos y SHOW TBLPROPERTIES para ver las restricciones de CHECK una tabla. El siguiente ejemplo añade una restricción a people_demo, y luego la muestra:

ALTER TABLE main.default.people_demo ADD CONSTRAINT validIds CHECK (id > 1 and id < 99999999);

DESCRIBE DETAIL main.default.people_demo;

SHOW TBLPROPERTIES main.default.people_demo;

Eliminar restricciones de comprobación

En Databricks Runtime 15.4 LTS y versiones posteriores, use el comando DROP FEATURE para quitar restricciones de verificación de una tabla y revertir el protocolo de la tabla.

Consulte Eliminar una característica de tabla de Delta Lake y degradar el protocolo de tabla.

Declarar restricciones de clave primaria, de clave foránea y de unicidad

La clave principal, la clave externa y las restricciones únicas son solo informativas y no se aplican. Pueden mejorar el rendimiento a través de optimizaciones de consultas.

  • Clave principal y clave externa: disponible para tablas de Unity Catalog y Delta Lake en Databricks Runtime 13.3 LTS y versiones posteriores. Disponibilidad general en Databricks Runtime 15.2 y versiones posteriores. Las claves externas deben hacer referencia a una clave principal o una restricción única en otra tabla.
  • Único: disponible en versión preliminar pública para tablas de Unity Catalog y Delta Lake en Databricks SQL y Databricks Runtime 18.2 y versiones posteriores. Una tabla puede tener varias restricciones únicas. Las claves externas pueden hacer referencia a una columna única mediante REFERENCES parent_table(unique_col). Las columnas únicas pueden ser nullables porque NULL los valores se tratan como distintos entre sí.

Consulte el information_schema, use DESCRIBE TABLE EXTENDED o use SHOW CREATE TABLE para obtener detalles sobre cómo se aplican las restricciones en todo un catálogo dado.

Agregar a nuevas tablas

Declare las claves principales, las claves externas y las restricciones únicas como parte de la cláusula de especificación de tabla durante la creación de la tabla:

CREATE OR REPLACE TABLE main.default.T(pk1 INTEGER NOT NULL, pk2 INTEGER NOT NULL,
                CONSTRAINT t_pk PRIMARY KEY(pk1, pk2));
CREATE OR REPLACE TABLE main.default.S(pk INTEGER NOT NULL PRIMARY KEY,
                fk1 INTEGER, fk2 INTEGER,
                CONSTRAINT s_t_fk FOREIGN KEY(fk1, fk2) REFERENCES main.default.T);
CREATE OR REPLACE TABLE main.default.U(id INTEGER NOT NULL, email STRING NOT NULL,
                CONSTRAINT u_uq_email UNIQUE(email));

Las instrucciones CTAS no admiten esta cláusula de restricción.

Agregar a tablas existentes

Alternativamente, añadir las mismas restricciones a las tablas que ya existen. Este enfoque alcanza el mismo resultado que la sección anterior. El siguiente ejemplo recrea T, S, y U sin restricciones, luego añade cada restricción con ALTER TABLE ADD CONSTRAINT. Añade una clave primaria antes de la clave externa que la referencia:

CREATE OR REPLACE TABLE main.default.T(pk1 INTEGER NOT NULL, pk2 INTEGER NOT NULL);
CREATE OR REPLACE TABLE main.default.S(pk INTEGER NOT NULL, fk1 INTEGER, fk2 INTEGER);
CREATE OR REPLACE TABLE main.default.U(id INTEGER NOT NULL, email STRING NOT NULL);

ALTER TABLE main.default.T ADD CONSTRAINT t_pk PRIMARY KEY(pk1, pk2);
ALTER TABLE main.default.S ADD CONSTRAINT s_t_fk FOREIGN KEY(fk1, fk2) REFERENCES main.default.T;
ALTER TABLE main.default.U ADD CONSTRAINT u_uq_email UNIQUE(email);

Recursos adicionales