Restrições no Azure Databricks

Azure Databricks dá suporte a cláusulas de gerenciamento de restrição SQL padrão:

  • Restrições impostas verificam a integridade dos dados antes de adicionar linhas a uma tabela.
  • Restrições informativas (chave primária, chave estrangeira e restrições exclusivas) definem relações entre campos em tabelas e não são impostas.

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

Para um conceito relacionado em pipelines do Lakeflow, consulte Gerenciar a qualidade dos dados com expectativas de pipeline.

Restrições impostas

Quando uma restrição é violada, a transação falha com um erro. Azure Databricks dá suporte a 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.

Note

A adição de uma restrição atualiza o protocolo de gravador de tabela se a versão atual do gravador for menor que 3. Isso pode afetar a compatibilidade com clientes externos do Delta Lake. Consulte a compatibilidade de recursos e protocolos do Delta Lake.

Restrição NOT NULL

Ao criar uma tabela, especifique NOT NULL restrições no esquema. Para eliminar ou adicionar NOT NULL restrições após a criação, use o ALTER TABLE ... ALTER COLUMN comando. O exemplo a seguir cria uma people_demo tabela que o restante desta seção 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 verifica se todas as linhas existentes atendem à restrição antes de adicionar uma restrição NOT NULL a uma tabela.

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

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

Restrição CHECK

Gerencie CHECK restrições com 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 adicionar a restrição à tabela.

As seguintes restrições se aplicam a constrangimentos de verificação:

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

Adicionar a uma tabela existente

O exemplo a seguir adiciona uma CHECK restrição à people_demo tabela criada na seção anterior, e depois a 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 e ALTER TABLE DROP CONSTRAINT.

Exibir propriedades da tabela de restrição de verificação

Use os DESCRIBE DETAIL comandos e SHOW TBLPROPERTIES para ver as restrições de CHECK uma tabela. O exemplo a seguir adiciona uma restrição a people_demo, e então a exibe:

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;

Remover restrições de verificação

No Databricks Runtime 15.4 LTS e posteriores, use o comando DROP FEATURE para remover restrições de verificação de uma tabela e rebaixar o protocolo de tabela.

Confira Remover um recurso de tabela do Delta Lake e fazer downgrade do protocolo de tabela.

Declarar chave primária, chave estrangeira e restrições exclusivas

A chave primária, a chave estrangeira e as restrições exclusivas são somente informativas e não são impostas. Eles podem melhorar o desempenho por meio de otimizações de consulta.

  • Chave primária e chave estrangeira: disponível para Unity Catalog e as tabelas Delta Lake no Databricks Runtime 13.3 LTS e posteriores. GA no Databricks Runtime 15.2 e superior. As chaves estrangeiras devem fazer referência a uma chave primária ou restrição exclusiva em outra tabela.
  • Exclusivo: disponível em versão preliminar pública para o Catálogo do Unity e tabelas delta lake no Databricks SQL e no Databricks Runtime 18.2 e superior. Uma tabela pode ter várias restrições exclusivas. Chaves estrangeiras podem referenciar uma coluna única usando REFERENCES parent_table(unique_col). Colunas exclusivas podem ser anuláveis porque NULL os valores são tratados como distintos uns dos outros.

Consulte o information_schema, use DESCRIBE TABLE EXTENDED ou use SHOW CREATE TABLE para obter detalhes sobre como as restrições são aplicadas em um catálogo específico.

Adicionar a novas tabelas

Declare chaves primárias, chaves estrangeiras e restrições exclusivas como parte da cláusula de especificação da tabela durante a criação da tabela:

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

As instruções CTAS não oferecem suporte a essa cláusula de restrição.

Adicionar a tabelas existentes

Alternativamente, adicione as mesmas restrições às tabelas que já existem. Essa abordagem alcança o mesmo resultado da seção anterior. O exemplo a seguir recria T, , e U sem restrições, então adiciona cada restrição com ALTER TABLE ADD CONSTRAINTS. Adicione uma chave primária antes da chave estrangeira que a 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 adicionais