Restrições em Databricks

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

  • As restrições impostas garantem que a qualidade e a integridade dos dados adicionados a uma tabela sejam verificadas automaticamente.

  • As restrições informativas key primária e key estrangeira codificam relacionamentos entre campos em tabelas e não são impostas.

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

Delta Live Tables tem um conceito semelhante conhecido como expectativas. Veja como gerenciar a qualidade dos dados com Delta Live Tables.

Restrições impostas no Databricks

Quando uma restrição é violada, a transação falha com um erro. Dois tipos de restrições são suportados:

  • NOT NULL: indica que os valores em colunas específicas não podem ser nulos.

  • CHECK: indica que uma expressão Boolean especificada deve ser verdadeira para cada linha de entrada.

Importante

Adicionar uma restrição atualiza automaticamente a versão do protocolo do gravador de tabela se a versão anterior do gravador for menor que 3. Consulte Como o Databricks gerencia a compatibilidade do recurso Delta Lake? para entender o versionamento do protocolo de tabela e o que significa atualizar a versão do protocolo.

Definir uma restrição NOT NULL no Databricks

Você especifica restrições NOT NULL no esquema ao criar 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 Databricks verifica se todas as linhas existentes atendem à restrição.

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

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

Definir uma restrição CHECK no Databricks

Você gerencia 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;

Consulte ALTER TABLE ADD CONSTRAINT e ALTER TABLE DROP CONSTRAINT.

CHECK as restrições são expostas como propriedades da 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 relacionamentos de chave primária e chave estrangeira

Observação

  • As restrições primárias key e estrangeiras key estão disponíveis em Databricks Runtime 11.3 LTS e acima, e são totalmente GA em Databricks Runtime 15.2 e acima.

  • As restrições key primária e key estrangeira requerem Unity Catalog e Delta Lake.

Você pode usar relacionamentos key primária e key estrangeira em campos nas tabelas Unity Catalog . key primária e estrangeira são apenas informativas e não são aplicadas. key estrangeira deve fazer referência a uma key primária em outra tabela.

Você pode declarar key primária e key estrangeira como parte da cláusula de especificação da tabela durante a criação da tabela. Esta cláusula não é permitida durante 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 query o information_schema ou usar DESCRIBE para obter detalhes sobre como as restrições são aplicadas em um determinado catálogo.

Ver: