Vincoli in Azure Databricks

Azure Databricks supporta clausole di gestione dei vincoli SQL standard. I vincoli rientrano in due categorie:

  • I controint applicati assicurano che la qualità e l'integrità dei dati aggiunti a una tabella vengano verificati automaticamente.
  • I vincoli di chiave primaria e di chiave esterna informativi codificano le relazioni tra i campi nelle tabelle e non vengono applicati.

Tutti i vincoli in Azure Databricks richiedono Delta Lake.

Le tabelle live delta hanno un concetto simile noto come aspettative. Vedere Gestire la qualità dei dati con le tabelle live Delta.

Vincoli applicati in Azure Databricks

Quando viene violato un vincolo, la transazione ha esito negativo e viene generato un errore. Sono supportati 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

L'aggiunta di un vincolo aggiorna automaticamente la versione del protocollo del writer di tabelle se la versione precedente del writer era minore di 3. Vedere In che modo Azure Databricks gestisce la compatibilità delle funzionalità Delta Lake? per comprendere il controllo delle versioni dei protocolli di tabella e cosa significa aggiornare la versione del protocollo.

Impostare un NOT NULL vincolo in Azure Databricks

Quando si crea una tabella, si specificano NOT NULL vincoli nello schema. È possibile eliminare o aggiungere NOT NULL vincoli usando 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
) USING DELTA;

ALTER TABLE people10m ALTER COLUMN middleName DROP NOT NULL;
ALTER TABLE people10m ALTER COLUMN ssn SET NOT NULL;

Prima di aggiungere un NOT NULL vincolo a una tabella, Azure Databricks verifica che tutte le righe esistenti soddisfino il vincolo.

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

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

Impostare un CHECK vincolo in Azure Databricks

I vincoli vengono gestiti CHECK usando i ALTER TABLE ADD CONSTRAINT comandi e ALTER TABLE DROP CONSTRAINT . ALTER TABLE ADD CONSTRAINT verifica che tutte le righe esistenti soddisfino il vincolo prima di aggiungerle alla tabella.

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;

Vedere ALTER TABLE ADD CONSTRAINT e ALTER TABLE DROP CONSTRAINT.

CHECK I vincoli vengono esposti come proprietà di tabella nell'output dei DESCRIBE DETAIL comandi e SHOW TBLPROPERTIES .

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

DESCRIBE DETAIL people10m;

SHOW TBLPROPERTIES people10m;

Dichiarare le relazioni tra chiave primaria e chiave esterna

Importante

Questa funzionalità è disponibile in anteprima pubblica.

Nota

  • I vincoli di chiave primaria e di chiave esterna sono disponibili in Databricks Runtime 11.3 LTS e versioni successive.
  • I vincoli di chiave primaria e di chiave esterna richiedono il catalogo Unity e Delta Lake.

È possibile usare le relazioni chiave primaria e di chiave esterna nei campi nelle tabelle del catalogo Unity. Le chiavi primarie ed esterne sono solo informative e non vengono applicate. Le chiavi esterne devono fare riferimento a una chiave primaria in un'altra tabella.

È possibile dichiarare chiavi primarie e chiavi esterne come parte della clausola di specifica della tabella durante la creazione della tabella. Questa clausola non è consentita durante le istruzioni CTAS. È anche possibile aggiungere vincoli alle tabelle esistenti.

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

È possibile eseguire query su information_schema o usare DESCRIBE per ottenere informazioni dettagliate sul modo in cui i vincoli vengono applicati in un determinato catalogo.

Vedere: