Begränsningar för Azure Databricks

Azure Databricks stöder standardsatser för SQL-begränsningshantering:

  • Framtvingade begränsningar verifierar dataintegriteten innan du lägger till rader i en tabell.
  • Informationsbegränsningar (primärnyckel, sekundärnyckel och unika begränsningar) definierar relationer mellan fält i tabeller och tillämpas inte.

Alla begränsningar för Azure Databricks kräver Delta Lake.

Ett relaterat begrepp i Lakeflow-pipelines finns i Hantera datakvalitet med pipelineförväntningar.

Framtvingade begränsningar

När en begränsning överträds misslyckas transaktionen med ett fel. Azure Databricks stöder två typer av begränsningar:

  • NOT NULL: anger att värden i specifika kolumner inte får vara null.
  • CHECK: anger att ett angivet booleskt uttryck måste vara sant för varje indatarad.

Note

Om du lägger till en begränsning uppgraderas tabellskrivarens protokoll om den aktuella skrivarversionen är mindre än 3. Detta kan påverka kompatibiliteten med externa Delta Lake-klienter. Se Delta Lake-funktionskompatibilitet och protokoll.

NOT NULL tvång

När du skapar en tabell anger du NOT NULL begränsningar i schemat. För att ta bort eller lägga till NOT NULL begränsningar efter skapandet, använd kommandot ALTER TABLE ... ALTER COLUMN . Följande exempel skapar en people_demo tabell som resten av denna sektion återanvänder:

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;

Azure Databricks verifierar att alla befintliga rader uppfyller villkoret innan du lägger till en NOT NULL-begränsning i en tabell.

Om du anger ett NOT NULL villkor för en kolumn som är kapslad inom en struct får den överordnade structen inte heller vara null. Kolumner kapslade i matris- eller karttyper accepterar NOT NULL inte begränsningar.

Se CREATE TABLE [USING] och ALTER TABLE ALTER COLUMN.

CHECK tvång

Hantera CHECK begränsningar med kommandona ALTER TABLE ADD CONSTRAINT och ALTER TABLE DROP CONSTRAINT . ALTER TABLE ADD CONSTRAINT verifierar att alla befintliga rader uppfyller villkoret innan du lägger till villkoret i tabellen.

Följande begränsningar gäller för kontrollbegränsningar:

  • Ett CHECK villkorsuttryck kan använda alla SQL-funktioner i Spark som alltid returnerar samma resultat när samma argumentvärden anges, förutom följande typer av funktioner:
    • Användardefinierade funktioner.
    • Mängdfunktioner.
    • Fönsterfunktioner.
    • Funktioner som returnerar flera rader.

Lägg till i en befintlig tabell

Följande exempel lägger till en CHECK begränsning i tabellen som skapades people_demo i föregående avsnitt och tar sedan bort den:

ALTER TABLE main.default.people_demo ADD CONSTRAINT dateWithinRange CHECK (birthDate > '1900-01-01');
ALTER TABLE main.default.people_demo DROP CONSTRAINT dateWithinRange;

Se ALTER TABLE ADD CONSTRAINT och ALTER TABLE DROP CONSTRAINT.

Visa egenskaper för kontrollbegränsningstabell

Använd kommandona DESCRIBE DETAIL och SHOW TBLPROPERTIES för att se en tabells CHECK begränsningar. Följande exempel lägger till en begränsning till people_demo, och visar den sedan:

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;

Ta bort kontrollbegränsningar

I Databricks Runtime 15.4 LTS och senare använder du DROP FEATURE kommandot för att ta bort kontrollbegränsningar från en tabell och nedgradera tabellprotokollet.

Se Ta bort en Delta Lake-tabellfunktion och nedgradera tabellprotokollet.

Deklarera primärnyckel, sekundärnyckel och unika begränsningar

Primärnyckel, sekundärnyckel och unika begränsningar är endast informationsmässiga och tillämpas inte. De kan förbättra prestandan genom frågeoptimeringar.

  • Primärnyckel och främmande nyckel: tillgänglig för Unity Catalog- och Delta Lake-tabeller i Databricks Runtime 13.3 LTS och senare versioner. GA i Databricks Runtime 15.2 och senare. Främmande nycklar måste referera till en primärnyckel eller en unik begränsning i en annan tabell.
  • Unikt: tillgängligt i offentlig förhandsversion för Unity Catalog- och Delta Lake-tabeller i Databricks SQL och Databricks Runtime 18.2 och senare. En tabell kan ha flera unika begränsningar. Främmande nycklar kan referera till en unik kolumn med REFERENCES parent_table(unique_col). Unika kolumner kan vara nullbara eftersom NULL värden behandlas som åtskilda från varandra.

Fråga i information_schema, använd DESCRIBE TABLE EXTENDED eller använd SHOW CREATE TABLE för information om hur begränsningar tillämpas i en angiven katalog.

Lägg till i nya tabeller

Deklarera primära nycklar, sekundärnycklar och unika begränsningar som en del av tabellspecifikationssatsen när tabellen skapas:

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

CTAS-instruktioner stöder inte den här begränsningssatsen.

Lägg till i befintliga tabeller

Alternativt, lägg till samma begränsningar i tabeller som redan finns. Denna metod ger samma resultat som föregående avsnitt. Följande exempel återskapar T, S, och U utan begränsningar, och lägger sedan till varje begränsning med ALTER TABLE ADD CONSTRAINT. Lägg till en primärnyckel före främmande nyckeln som refererar till den:

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

Ytterligare resurser