Restrições no Azure Databricks

O Azure Databricks dá suporte a cláusulas de gerenciamento de restrição do SQL padrão. As restrições se enquadram em duas categorias:

  • Restrições impostas garantem que a qualidade e a integridade dos dados adicionados a uma tabela sejam verificadas automaticamente.
  • Restrições de chave primária e chave estrangeira informativas codificam relações entre campos em tabelas e não são impostas.

Todas as restrições no Azure Databricks exigem o Delta Lake.

O Delta Live Tables tem um conceito semelhante, conhecido como expectativas. Confira Gerenciar a qualidade dos dados com o Delta Live Tables.

Restrições impostas no Azure Databricks

Quando uma restrição é violada, a transação falha com um erro. Há suporte para dois tipos de restrições:

  • NOT NULL: indica que os valores em colunas específicas não podem ser nulos.
  • CHECK: indica que uma expressão booliana especificada precisa ser verdadeira para cada linha de entrada.

Importante

A adição de uma restrição atualizará automaticamente a versão do protocolo do gravador de tabela se a versão anterior do gravador for menor que 3. Confira Como o Azure Databricks gerenciar a compatibilidade de recursos do Delta Lake? para entender o controle de versão do protocolo de tabela e o que significa atualizar a versão do protocolo.

Definir uma restrição NOT NULL no Azure Databricks

Você especifica as restrições NOT NULL no esquema quando cria uma tabela. Você descarta ou adiciona restrições NOT NULL usando o comando 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
) USING DELTA;

ALTER TABLE people10m ALTER COLUMN middleName DROP NOT NULL;
ALTER TABLE people10m ALTER COLUMN ssn SET NOT NULL;

Antes de adicionar uma restrição NOT NULL a uma tabela, o Azure Databricks verifica se todas as linhas existentes atendem à restrição.

Se você especificar uma restrição NOT NULL em uma coluna aninhada em um struct, o struct pai também deverá ser não nulo. As colunas aninhadas em tipos de matriz ou de mapa não aceitam restrições NOT NULL.

Confira CREATE TABLE [USING] e ALTER TABLE ALTER COLUMN.

Definir uma restrição CHECK no Azure Databricks

Você gerencia as restrições CHECK usando os comandos ALTER TABLE ADD CONSTRAINT e ALTER TABLE DROP CONSTRAINT. ALTER TABLE ADD CONSTRAINT verifica se todas as linhas existentes atendem à restrição antes de adicioná-la à tabela.

CREATE TABLE people10m (
  id INT,
  firstName STRING,
  middleName STRING,
  lastName STRING,
  gender STRING,
  birthDate TIMESTAMP,
  ssn STRING,
  salary INT
) USING DELTA;

ALTER TABLE people10m ADD CONSTRAINT dateWithinRange CHECK (birthDate > '1900-01-01');
ALTER TABLE people10m DROP CONSTRAINT dateWithinRange;

Confira ALTER TABLE ADD CONSTRAINT e ALTER TABLE DROP CONSTRAINT.

As restrições CHECK são expostas como propriedades de tabela na saída dos comandos DESCRIBE DETAIL e SHOW TBLPROPERTIES.

ALTER TABLE people10m ADD CONSTRAINT validIds CHECK (id > 1 and id < 99999999);

DESCRIBE DETAIL people10m;

SHOW TBLPROPERTIES people10m;

Declarar relações de chave primária e chave estrangeira

Importante

Esse recurso está em uma versão prévia.

Observação

  • As restrições de chave primária e chave estrangeira estão disponíveis no Databricks Runtime 11.3 LTS e versões superiores.
  • As restrições de chave primária e chave estrangeira exigem o Catálogo do Unity e o Delta Lake.

Você pode usar relações de chave primária e chave estrangeira nos campos de tabelas do Catálogo do Unity. Chaves primárias e estrangeiras são somente informativas e não são impostas. Chaves estrangeiras devem fazer referência a uma chave primária em outra tabela.

Você pode declarar chaves primárias e chaves estrangeiras como parte da cláusula de especificação da tabela durante a criação da tabela. Essa cláusula não é permitida durante as instruções CTAS. Você também pode adicionar restrições a tabelas existentes.

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);

Você pode consultar information_schema ou usar DESCRIBE para obter detalhes sobre como as restrições são aplicadas em um determinado catálogo.

Consulte: