Restrições sobre Databricks
O Databricks oferece suporte a cláusulas padrão de gerenciamento de restrições SQL:
- As restrições impostas verificam a integridade dos dados antes de adicionar linhas a uma tabela.
- As restrições de chave primária, chave estrangeira e de exclusividade são apenas informativas, definem relações entre campos em tabelas e não são impostas.
Todas as restrições em Databricks exigem o Delta Lake.
Para um conceito relacionado no pipeline declarativo LakeFlow Spark , veja gerenciar a qualidade dos dados com as expectativas pipeline.
Restrições impostas no Databricks
Quando uma restrição é violada, a transação falha com um erro. O Databricks suporta dois tipos de restrições:
NOT NULL: indica que os valores em colunas específicas não podem ser nulos.CHECKindica que uma expressão booleana especificada deve ser verdadeira para cada linha de entrada.
Ao adicionar uma restrição, Databricks atualiza automaticamente a versão do protocolo de gravação da tabela se a versão anterior for inferior a 3. Consulte Compatibilidade e protocolos de recursosDelta 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 na Databricks
Ao criar uma tabela, especifique restrições NOT NULL no esquema. Para remover ou adicionar restrições NOT NULL , use 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
);
ALTER TABLE people10m ALTER COLUMN middleName DROP NOT NULL;
ALTER TABLE people10m ALTER COLUMN ssn SET NOT NULL;
O Databricks verifica se todas as linhas existentes satisfazem a 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 dentro de uma struct, a struct pai também não deve ser nula. 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.
Definir uma restrição CHECK na Databricks
gerenciar restrições CHECK com os comandos ALTER TABLE ADD CONSTRAINT e ALTER TABLE DROP CONSTRAINT . ALTER TABLE ADD CONSTRAINT verifica se todas as linhas existentes satisfazem a restrição antes de adicionar a restrição à tabela.
As seguintes restrições se aplicam às restrições de verificação:
- Uma expressão de restrição
CHECKpode usar qualquer função SQL no Spark que sempre retorne o mesmo resultado quando receber os mesmos valores de argumento, exceto os seguintes tipos de funções:- Funções definidas pelo usuário.
- Funções agregadas.
- Funções da janela.
- Funções que retornam múltiplas linhas.
Adicionar a uma tabela 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 verificar propriedades da tabela de restrições
Use os comandos DESCRIBE DETAIL e SHOW TBLPROPERTIES para ver as restrições CHECK de 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 versões superiores, use o comando DROP FEATURE para remover as restrições de verificação de uma tabela e rebaixar o protocolo da tabela.
Consulte Drop a Delta Lake table recurso e downgrade table protocol.
Declarar chave primária, chave estrangeira e restrições de unicidade
Restrições key primária e key estrangeira estão disponíveis para tabelas Unity Catalog e Delta Lake no Databricks Runtime 13.3 LTS e versões superiores, e são GA (Disponibilidade Geral) no Databricks Runtime 15.2 e versões superiores.
Restrições exclusivas estão disponíveis para tabelas do Unity Catalog e do Delta Lake no Databricks SQL e no Databricks Runtime 18.2 e acima, e em Pré-lançamento público. Uma tabela pode ter múltiplas restrições exclusivas. Chaves estrangeiras podem referenciar uma coluna única em outra tabela usando REFERENCES parent_table(unique_col). Colunas em uma restrição exclusiva podem ser anuláveis, inclusive quando a restrição é referenciada por uma chave estrangeira. Valores NULL em colunas exclusivas são tratados como distintos um do outro, portanto valores duplicados NULL não violam a semântica de uma restrição de exclusividade.
As restrições de chave primária, chave estrangeira e chave única são apenas informativas e não são impostas. Chaves estrangeiras devem fazer referência a uma chave primária ou a uma restrição de unicidade em outra tabela. Essas restrições podem melhorar o desempenho com otimizações de query.
É possível consultar o information_schema, usar DESCRIBE TABLE EXTENDED ou SHOW CREATE TABLE para obter detalhes sobre como as restrições são aplicadas em um determinado catálogo.
Adicionar a novas tabelas
Declarar chaves primárias, chaves estrangeiras e restrições de exclusividade 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);
CREATE TABLE U(id INTEGER NOT NULL, email STRING NOT NULL,
CONSTRAINT u_uq_email UNIQUE(email));
As instruções CTAS não suportam essa cláusula de restrição.
Adicionar às tabelas existentes
Para adicionar restrições a 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;
ALTER TABLE U ADD CONSTRAINT u_uq_email UNIQUE(email);