Merk
Tilgang til denne siden krever autorisasjon. Du kan prøve å logge på eller endre kataloger.
Tilgang til denne siden krever autorisasjon. Du kan prøve å endre kataloger.
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:
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_INSERTtilONom 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
IDENTITYkolonner 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
IDENTITYkolonne i en eksisterende tabell medALTER TABLEstøttes ikke. Vurder å bruke CREATE TABLE AS SELECT (CTAS) eller SELECT... INTO for å lage en kopi av en eksisterende tabell og legge til enIDENTITYkolonne. - Begrensninger gjelder for hvordan
IDENTITYkolonner bevares når du oppretter en tabell ved å velge fra en annen tabell med CTAS ellerSELECT...INTO. For mer informasjon, se avsnittet om datatyper i SELECT - INTO Clause (Transact-SQL). -
DBCC CHECKIDENTStøtter kun alternativetRESEED. Å spesifisere en egendefinert så-verdi eller brukeNORESEEDstøttes ikke. -
IDENTITYKolonner 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.