IDENTITY-kolonner i Fabric datalager

Gjelder for:✅ Lager i Microsoft Fabric

I Fabric datalager IDENTITY genererer kolonner automatisk nye numeriske verdier når du setter inn nye rader i en tabell.

Surrogatnøkler er identifikatorer som brukes i datalagring for å unikt skille rader, uavhengig av deres naturlige nøkler. Denne artikkelen forklarer hvordan man oppretter og administrerer surrogatnøkler ved å bruke IDENTITY, inkludert å sette inn eksplisitte verdier og sette inn nye seeding.

Hvorfor bruke en IDENTITET-kolonne?

IDENTITY Kolonner eliminerer manuell nøkkeltildeling, reduserer risikoen for feil og forenkler datainntaket. Systemstyrte unike verdier er ideelle som surrogatnøkler og primærnøkler. Sammenlignet med manuelle tilnærminger IDENTITY tilbyr kolonner bedre ytelse fordi unike nøkler genereres automatisk uten ekstra spørringslogikk.

Bigint-datatypen, som kreves for IDENTITY kolonner, kan lagre opptil 9 223 372 036 854 775 807 positive heltallsverdier. Dette området sikrer at hver rad får en unik verdi i sin IDENTITY kolonne gjennom hele tabellens levetid.

For en plan om å migrere data med surrogatnøkler fra andre databaseplattformer, se Migrate IDENTITY-kolonner til Fabric datalager.

Syntaks

For å definere en IDENTITY kolonne i Fabric datalager, bruk egenskapen IDENTITY i kolonnedefinisjonen:

CREATE TABLE { warehouse_name.schema_name.table_name | schema_name.table_name | table_name } (
    [ column_name ] BIGINT IDENTITY ,
    [ ,...n ]
    -- Other columns here
);

Identitetskolonnen trenger ikke å være den første kolonnen i tabelldefinisjonen.

Hvordan IDENTITY-kolonner fungerer

I Fabric datalager kan du ikke spesifisere en egendefinert startverdi eller inkrement. Systemet håndterer verdier internt for å sikre unikhet. IDENTITY kolonner gir alltid positive heltallsverdier. Hver ny rad får en ny verdi, og unikhet er garantert så lenge tabellen eksisterer. Når en verdi er brukt, IDENTITY brukes ikke den samme verdien igjen. Hull kan oppstå i verdiene som kolonnen IDENTITY produserer.

Tildeling av verdier

På grunn av den distribuerte arkitekturen til warehouse-motoren, garanterer ikke egenskapen IDENTITY rekkefølgen surrogatverdiene fordeles i. Egenskapen skaleres ut på tvers av beregningsnoder for å maksimere parallellisme uten å påvirke lastytelsen. Som et resultat kan verdispennene fra ulike inntaksoppgaver være uregelmessige.

Følgende eksempel illustrerer denne oppførselen:

-- Create a table with an IDENTITY column
CREATE TABLE dbo.Table1(
    Column1 BIGINT IDENTITY,
    Column2 VARCHAR(30) NULL
)

-- Ingestion task A
INSERT INTO dbo.Table1
VALUES (NULL), (NULL), (NULL), (NULL);

-- Ingestion task B
INSERT INTO dbo.Table1
VALUES (NULL), (NULL), (NULL), (NULL);

-- Review the data
SELECT * FROM dbo.Table1;

Eksempelresultat:

Skjermbilde av resultatsettet til en spørring i en tabell med to kolonner merket Kolonne1 og Kolonne2, som viser åtte rader med data. Kolonne 1 inneholder store numeriske verdier, kolonne 2 inneholder teksten.

I dette eksempelet, Ingestion task A og Ingestion task B kjøres sekvensielt som uavhengige oppgaver. Selv om oppgavene kjøres sammenhengende, har den første og siste fire radene forskjellige identitetsnøkkelområder i dbo.Table1.Column1. Gap mellom områdene tildelt oppgave A og oppgave B kan også oppstå.

IDENTITYi Fabric datalager garanterer at alle verdier i en IDENTITY kolonne er unike så lenge den IDENTITY_INSERT ikke brukes, men det kan oppstå hull i intervallene som produseres for en inntaksoppgave.

Systemmetadataobjekter

Følgende systemmetadata-objekter er tilgjengelige og nyttige når man designer og arbeider med identitetsverdier i Fabric datalager.

List identitetskolonner med sys.identity_columns systemvisning

Bruk sys.identity_columns katalogvisning for å liste opp alle identitetskolonner i et lager. Følgende eksempel viser alle tabeller som inneholder en IDENTITY kolonne, inkludert skjema-, tabell- og identitetskolonnenavn:

SELECT
    s.name AS SchemaName,
    t.name AS TableName,
    c.name AS IdentityColumnName
FROM
    sys.identity_columns AS ic
INNER JOIN
    sys.columns AS c ON ic.[object_id] = c.[object_id]
    AND ic.column_id = c.column_id
INNER JOIN
    sys.tables AS t ON ic.[object_id] = t.[object_id]
INNER JOIN
    sys.schemas AS s ON t.[schema_id] = s.[schema_id]
ORDER BY
    s.name, t.name;

I Fabric datalager seed_value blir ikke og increment_value return-kolonnene sys.identity_columnsNULL og oppdatert etter at identitetskolonnen er opprettet. Kolonnen last_value returnerer NULL som standard, men bytter permanent til -1 etter den første identitetsinnsettingen i tabellen.

Sett inn verdier med IDENTITY_INSERT

Som standard kan du ikke sette inn verdier i en IDENTITY kolonne. Du må imidlertid kanskje sette inn spesifikke verdier under datamigrering, katastrofegjenoppretting eller når du fyller ut sentinel-verdier, for eksempel -1 for «Ukjent» i dimensjonstabeller.

Bruk SET IDENTITY_INSERT for midlertidig å tillate eksplisitte innsettinger i en identitetskolonne:

SET IDENTITY_INSERT dbo.DimCustomer ON;

INSERT INTO dbo.DimCustomer (CustomerKey, CustomerName, Email)
VALUES (-1, 'John Doe', 'john@contoso.com');

SET IDENTITY_INSERT dbo.DimCustomer OFF;

Når IDENTITY_INSERT er ON:

  • En kolonneliste er nødvendig med setningen INSERT .
  • Kun én tabell per økt kan settes IDENTITY_INSERT til ON om gangen.

Viktig!

Etter at du har slått avIDENTITY_INSERT, så identitetsverdier med DBCC CHECKIDENT.

Reseed identitetsverdier med DBCC CHECKIDENT

Etter at du har satt inn eksplisitte verdier med IDENTITY_INSERT, bruk DBCC CHECKIDENT for å sette inn identitetskolonnen. Operasjonen RESEED skanner alle brukte og reserverte identitetsområder på tvers av distribuerte beregningsnoder for å finne riktige neste verdier, noe som sikrer unikhet og forhindrer nøkkelkollisjoner.

DBCC CHECKIDENT('dbo.DimProduct', RESEED);

I Fabric datalager støtter kun DBCC CHECKIDENT alternativetRESEED. Lageret bestemmer automatisk de riktige neste verdiområdene, og du kan ikke spesifisere en egendefinert sådd-verdi. For mer informasjon, se DBCC CHECKIDENT.

Begrensninger

For mer informasjon, se IDENTITY-kolonner, IDENTITY (Transact-SQL) ogCreate tables i Warehouse i Microsoft Fabric.

  • Kun bigint-datatypen støttes for IDENTITY kolonner i Fabric datalager. Andre datatyper resulterer i en feil.
  • Å definere et frø og en økning støttes ikke. Systemet håndterer verdier internt.
  • Å legge til en IDENTITY kolonne i en eksisterende tabell med ALTER TABLE støttes ikke. Vurder å bruke CREATE TABLE AS SELECT (CTAS) eller SELECT... INTO for å lage en kopi av en eksisterende tabell og legge til en IDENTITY kolonne.
  • Begrensninger gjelder for hvordan IDENTITY kolonner bevares når du oppretter en tabell ved å velge fra en annen tabell med CTAS eller SELECT...INTO. For mer informasjon, se avsnittet om datatyper i SELECT - INTO Clause (Transact-SQL).
  • DBCC CHECKIDENT Støtter kun alternativet RESEED . Å spesifisere en egendefinert så-verdi eller bruke NORESEED støttes ikke.
  • IDENTITY Kolonner gir verdier som er garantert unike, men verdiene er ikke nødvendigvis sekvensielle eller ordnede, og hull kan oppstå.

Eksempler

En. Opprett en tabell med en IDENTITET-kolonne

CREATE TABLE Employees (
    EmployeeID BIGINT IDENTITY,
    FirstName VARCHAR(50),
    LastName VARCHAR(50)
);

Denne setningen lager en Employees tabell hvor hver ny rad automatisk mottar en unik EmployeeID verdi som bigint .

B. Sett inn rader i en tabell med en identitetskolonne

Når du oppgir verdier for hver ikke-identitetskolonne i deres definerte rekkefølge, trenger du ikke å spesifisere en kolonneliste:

INSERT INTO Employees VALUES ('Quarantino', 'Esposito');

Du kan også oppgi en kolonneliste som utelater identitetskolonnen:

INSERT INTO Employees (FirstName, LastName)
VALUES ('Ensi', 'Vasala');

C. Sett inn eksplisitte verdier med IDENTITY_INSERT

SET IDENTITY_INSERT dbo.Employees ON;

INSERT INTO dbo.Employees (EmployeeID, FirstName, LastName)
VALUES (100, 'Sentinel', 'Row');

SET IDENTITY_INSERT dbo.Employees OFF;

D. Sett inn eksplisitte verdier med COPY INTO

Setningen COPY INTO støtter IDENTITY_INSERT muligheten til å ta inn eksplisitte verdier i kommandoen. COPY INTO Alternativer overstyrer alle innstillinger på øktnivå for IDENTITY_INSERT.

COPY INTO dbo.Employees (EmployeeID 1, FirstName 2, LastName 3)
FROM 'https://myaccount.blob.core.windows.net/myblobcontainer/folder1/'
WITH (
    FILE_TYPE = 'CSV',
    IDENTITY_INSERT = 'ON'
);

E. Omfrø en tabell etter eksplisitte innsettinger

DBCC CHECKIDENT('dbo.Employees', RESEED);

F. Lag en tabell med CREATE TABLE AS SELECT

Bruk CTAS for å lage en kopi av en tabell og oppretthold egenskapen IDENTITY i måltabellen:

CREATE TABLE RetiredEmployees
AS SELECT * FROM Employees;

Kolonnen i måltabellen arver egenskapen IDENTITY fra kildetabellen. For begrensninger, se avsnittet om datatyper i SELECT - INTO Clause.

G. Lag en tabell med SELECT... INN

Bruk SELECT...INTO for å lage en kopi av en tabell og lagre egenskapen IDENTITY i måltabellen:

SELECT *
INTO dbo.RetiredEmployees
FROM dbo.Employees
WHERE LastName = 'Esposito';

Kolonnen i måltabellen arver egenskapen IDENTITY fra kildetabellen. For begrensninger, se avsnittet om datatyper i SELECT - INTO Clause.

Neste trinn: