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.
- Restrições informativas (key primária, key estrangeira e restrições exclusivas) 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 nos LakeFlow Pipelines, 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. 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.
A adição de uma restrição atualiza o protocolo de gravação da tabela se a versão atual do gravador for inferior a 3. Isso pode afetar a compatibilidade com clientes externos do Delta Lake. Consulte a compatibilidade de recursos e protocolos do Delta Lake.
NOT NULL restrição
Ao criar uma tabela, especifique as restrições NOT NULL no esquema. Para descartar ou adicionar restrições NOT NULL após a criação, use o comando ALTER TABLE ... ALTER COLUMN. O exemplo a seguir cria uma tabela people_demo 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;
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.
CHECK restrição
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
O exemplo a seguir adiciona uma restrição CHECK à tabela people_demo criada na seção anterior e, em seguida, a descarta:
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.
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. O exemplo a seguir adiciona uma restrição a people_demo e, em seguida, 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 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
As restrições de chave primária, chave estrangeira e chave única são apenas informativas e não são impostas. Eles podem melhorar o desempenho por meio de otimizações de query.
- **Key primária e key estrangeira**: disponíveis para tabelas do Unity Catalog e Delta Lake no Databricks Runtime 13.3 LTS e superior. Disponibilidade geral (GA) no Databricks Runtime 15.2 e acima. As keys estrangeiras devem fazer referência a uma key primária ou restrição exclusiva em outra tabela.
- Exclusivo: disponível em pré-lançamento público para Unity Catalog e tabelas Delta Lake no Databricks SQL e Databricks Runtime 18.2 e acima. Uma tabela pode ter múltiplas restrições únicas. key estrangeiras podem referenciar uma coluna única usando
REFERENCES parent_table(unique_col). Colunas únicas podem ser anuláveis porque os valores deNULLsão tratados como distintos entre si.
É 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 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 suportam essa cláusula de restrição.
Adicionar às tabelas existentes
Alternativamente, adicione as mesmas restrições a tabelas que já existem. Essa abordagem alcança o mesmo resultado que a seção anterior. O exemplo a seguir recria T, S e U sem restrições e, em seguida, adiciona cada restrição com ALTER TABLE ADD CONSTRAINT. 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);