Restrições no Azure Databricks

Azure Databricks suporta cláusulas padrão de gestão de restrições SQL:

  • Restrições impostas verificam a integridade dos dados antes de adicionar linhas a uma tabela.
  • Restrições de chave primária e chave estrangeira apenas informativas definem relações entre campos nas tabelas e não são obrigatórias.

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

Para um conceito relacionado em Lakeflow Spark Declarative Pipelines, veja Gerir a qualidade dos dados com expectativas de pipeline.

Restrições impostas à Azure Databricks

Quando uma restrição é violada, a transação falha com um erro. O Azure Databricks suporta 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 booleana especificada deve ser verdadeira para cada linha de entrada.

Importante

Quando adicionas uma restrição, o Azure Databricks atualiza automaticamente a versão do protocolo de escritor de tabelas se a versão anterior fosse inferior a 3. Consulte Compatibilidade de recursos e protocolos 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 de NOT NULL no Azure Databricks

Ao criar uma tabela, especifique NOT NULL restrições no esquema. Para eliminar ou adicionar NOT NULL restrições, use o ALTER TABLE ... ALTER COLUMN comando:

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 verifica se todas as linhas existentes satisfazem a restrição antes de adicionar uma restrição NOT NULL a uma tabela.

Se especificar uma restrição de NOT NULL numa coluna aninhada dentro de uma struct, a struct mãe também não deverá ser nula. Colunas aninhadas dentro de tipos de array ou mapa não aceitam restrições NOT NULL.

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

Definir uma restrição de CHECK no Azure Databricks

Gerir restrições CHECK com os comandos ALTER TABLE ADD CONSTRAINT e ALTER TABLE DROP CONSTRAINT. ALTER TABLE ADD CONSTRAINT verifica que todas as linhas existentes satisfazem a restrição antes de a adicionar à tabela.

As seguintes restrições aplicam-se às condições de verificação:

  • Uma CHECK expressão de restrição pode usar quaisquer funções SQL no Spark que devolvam sempre o mesmo resultado quando recebem os mesmos valores de argumento, exceto os seguintes tipos de funções:
    • Funções definidas pelo utilizador.
    • Funções de agregação.
    • Funções de janela.
    • Funções que retornam várias linhas.

Adicionar a uma tabela já existente

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;

Consulte ALTER TABLE ADD CONSTRAINT e ALTER TABLE DROP CONSTRAINT.

Visualizar propriedades da tabela de restrições de verificação

Use os DESCRIBE DETAIL comandos e SHOW TBLPROPERTIES para ver as restrições de CHECK uma tabela.

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

DESCRIBE DETAIL people10m;

SHOW TBLPROPERTIES people10m;

Remover restrições de verificação

No Databricks Runtime 15.4 LTS e superiores, use o comando DROP FEATURE para remover restrições de verificação de uma tabela e reverter o protocolo da tabela para uma versão anterior.

Consulte Remover uma funcionalidade da tabela Delta Lake e fazer downgrade do protocolo da tabela.

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

Restrições de chave primária e chave externa estão disponíveis para tabelas Unity Catalog e Delta Lake em Databricks Runtime 13.3 LTS e superiores, e são GA em Databricks Runtime 15.2 e superiores.

As chaves primárias e estrangeiras são apenas informativas e não são aplicadas. As chaves estrangeiras devem fazer referência a uma chave primária em outra tabela. Restrições de chave informacional podem melhorar o desempenho com otimizações de consultas.

Consulte o information_schema ou use DESCRIBE para obter detalhes sobre como as restrições são aplicadas num dado catálogo.

Adicionar a novas tabelas

Declare as chaves primárias e estrangeiras como parte da cláusula de especificação da tabela durante a criação da tabela:

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

As declarações CTAS não suportam esta cláusula de restrição.

Adicionar às tabelas existentes

Para adicionar restrições às tabelas existentes:

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;