Condividi tramite


Vincoli in Azure Databricks

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

  • I vincoli 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. Consulta Gestisci la qualità dei dati con le aspettative della pipeline.

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 dello scrittore di tabelle se la versione precedente dello scrittore era minore di 3. Consulta In che modo Azure Databricks gestisce la compatibilità delle funzionalità di Delta Lake? per comprendere il versionamento del protocollo della tabella e cosa significa aggiornare la versione del protocollo.

Impostare un vincolo di NOT NULL in Azure Databricks

È possibile specificare vincoli NOT NULL nello schema quando si crea una tabella. È 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
);

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

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

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 array o tipi mappa non accettano vincoli NOT NULL.

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

Impostare un vincolo di CHECK 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
);

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.

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

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

DESCRIBE DETAIL people10m;

SHOW TBLPROPERTIES people10m;

Disabilitare i vincoli CHECK

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

Consulta le funzionalità della tabella Delta eliminate .

Dichiarare le relazioni tra chiave primaria e chiave esterna

Nota

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

È possibile usare le relazioni tra chiave primaria e chiave esterna nei campi delle 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 una query sul information_schema o usare DESCRIBE per ottenere informazioni dettagliate sulla modalità di applicazione dei vincoli in un determinato catalogo.

Vedere: