Vincoli in Azure Databricks

Azure Databricks supporta le clausole di gestione dei vincoli SQL standard:

  • I vincoli applicati verificano l'integrità dei dati prima di aggiungere righe a una tabella.
  • Le chiavi primarie informative e i vincoli di chiave esterna definiscono le relazioni tra i campi nelle tabelle e non vengono applicati.

Tutti i vincoli in Azure Databricks richiedono Delta Lake.

Per un argomento correlato nelle pipeline dichiarative di Lakeflow Spark, vedere Gestire la qualità dei dati con le aspettative della pipeline.

vincoli imposti su Azure Databricks

Quando viene violato un vincolo, la transazione ha esito negativo e viene generato un errore. Azure Databricks supporta due tipi di vincoli:

  • NOT NULL: indica che i valori in colonne specifiche non possono essere Null.
  • CHECK: indica che un'espressione booleana specificata deve essere true per ogni riga di input.

Importante

Quando si aggiunge un vincolo, Azure Databricks aggiorna automaticamente la versione del protocollo del writer di tabelle se la versione precedente del writer è minore di 3. Vedere Compatibilità e protocolli delle funzionalità Delta Lake per comprendere il versionamento dei protocolli di tabella e cosa significa aggiornare la versione del protocollo.

Impostare un vincolo di NOT NULL in Azure Databricks

Quando si crea una tabella, specificare NOT NULL i vincoli nello schema. Per eliminare o aggiungere NOT NULL vincoli, usare il 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 che tutte le righe esistenti soddisfino il vincolo prima di aggiungere un vincolo NOT NULL a una tabella.

Se si specifica un vincolo di NOT NULL su una colonna annidata all'interno di uno struct, lo struct padre non deve essere null. Le colonne annidate all'interno di tipi di array o di mappa non accettano NOT NULL vincoli.

Vedere CREATE TABLE [USANDO] e ALTER TABLE MODIFICA COLUMN.

Impostare un vincolo di CHECK in Azure Databricks

Gestire i vincoli con i comandi ALTER TABLE ADD CONSTRAINT e ALTER TABLE DROP CONSTRAINT. ALTER TABLE ADD CONSTRAINT verifica che tutte le righe esistenti soddisfino il vincolo prima di aggiungere il vincolo alla tabella.

Le seguenti restrizioni si applicano ai vincoli check:

  • Un'espressione CHECK di vincolo può usare qualsiasi funzione SQL in Spark che restituisce sempre lo stesso risultato quando vengono specificati gli stessi valori di argomento, ad eccezione dei tipi di funzioni seguenti:
    • Funzioni definite dall'utente.
    • Funzioni di aggregazione.
    • Funzioni finestra.
    • Funzioni che restituiscono più righe.

Aggiungere a una tabella esistente

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;

Vedere ALTER TABLE ADD CONSTRAINT e ALTER TABLE DROP CONSTRAINT.

Visualizzare le proprietà della tabella dei vincoli CHECK

Usare i DESCRIBE DETAIL comandi e SHOW TBLPROPERTIES per visualizzare i vincoli di CHECK una tabella.

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

DESCRIBE DETAIL people10m;

SHOW TBLPROPERTIES people10m;

Rimuovere i vincoli CHECK

In Databricks Runtime 15.4 LTS e versioni successive usare il comando per rimuovere i vincoli check da una tabella e effettuare il DROP FEATURE downgrade del protocollo di tabella.

Vedere Eliminare una funzionalità di tabella Delta Lake e effettuare il downgrade del protocollo di tabella.

Dichiarare le relazioni tra chiave primaria e chiave esterna

I vincoli di chiave primaria e di chiave esterna sono disponibili per le tabelle Unity Catalog e Delta Lake in Databricks Runtime 13.3 LTS e versioni successive e sono disponibili a livello generale in Databricks Runtime 15.2 e versioni successive.

Le chiavi primarie e esterne sono solo informative e non vengono applicate. Le chiavi esterne devono fare riferimento a una chiave primaria in un'altra tabella. I vincoli di chiave informativa potrebbero migliorare le prestazioni con le ottimizzazioni delle query.

Eseguire una query sull'oggetto information_schema o usare DESCRIBE per ottenere informazioni dettagliate sul modo in cui i vincoli vengono applicati in un determinato catalogo.

Aggiungere a nuove tabelle

Dichiarare chiavi primarie e chiavi esterne come parte della clausola di specifica della tabella durante la creazione della tabella:

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

Le istruzioni CTAS non supportano questa clausola di vincolo.

Aggiungere a tabelle esistenti

Per aggiungere vincoli alle tabelle esistenti:

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;