IDENTITY-kolonner i Fabric data warehouse

Gælder for:✅ Warehouse i Microsoft Fabric

I Fabric data warehouse genererer kolonner automatisk nye numeriske værdier, IDENTITY når du indsætter nye rækker i en tabel.

Surrogatnøgler er identifikatorer, der bruges i datalager til unikt at skelne rækker, uafhængigt af deres naturlige nøgler. Denne artikel forklarer, hvordan man opretter og administrerer surrogatnøgler ved hjælp af IDENTITY, herunder indsættelse af eksplicitte værdier og genseedning.

Hvorfor bruge en IDENTITET-kolonne?

IDENTITY Kolonner eliminerer manuel nøglefordeling, hvilket reducerer risikoen for fejl og forenkler dataindlæsning. Systemadministrerede unikke værdier er ideelle som surrogatnøgler og primærnøgler. Sammenlignet med manuelle tilgange tilbyder kolonner bedre ydeevne, IDENTITY fordi unikke nøgler genereres automatisk uden ekstra forespørgselslogik.

Bigott-datatypen, som kræves for IDENTITY kolonner, kan gemme op til 9.223.372.036.854.775.807 positive heltalsværdier. Dette interval sikrer, at hver række modtager en unik værdi i sin IDENTITY kolonne gennem hele tabellens levetid.

For en plan om at migrere data med surrogatnøgler fra andre databaseplatforme, se Migrate IDENTITY-kolonner til Fabric data warehouse.

Syntaks

For at definere en IDENTITY kolonne i Fabric data warehouse, brug egenskaben IDENTITY i kolonnedefinitionen:

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

Identitetskolonnen behøver ikke at være den første kolonne i tabeldefinitionen.

Hvordan IDENTITY-kolonner fungerer

I Fabric data warehouse kan du ikke angive en brugerdefineret startværdi eller inkrement. Systemet håndterer værdier internt for at sikre unikhed. IDENTITY kolonner producerer altid positive heltalsværdier. Hver ny række modtager en ny værdi, og entydighed er garanteret, så længe tabellen eksisterer. Når en værdi er brugt, IDENTITY bruges den samme værdi ikke igen. Der kan opstå huller i de værdier, som kolonnen IDENTITY producerer.

Fordeling af værdier

På grund af warehouse-motorens distribuerede arkitektur garanterer egenskaben IDENTITY ikke rækkefølgen, hvori surrogatværdier allokeres. Egenskaben skaleres ud på tværs af beregningsnoder for at maksimere parallelisme uden at påvirke belastningsydelsen. Som følge heraf er værdiintervaller fra forskellige indtagelsesopgaver måske ikke sekventielle.

Følgende eksempel illustrerer denne adfærd:

-- 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:

Skærmbillede af resultatsættet for en forespørgsel i en tabel med to kolonner mærket Kolonne1 og Kolonne2, der viser otte rækker med data. Kolonne 1 indeholder store numeriske værdier, kolonne 2 indeholder teksten.

I dette eksempel og Ingestion task AIngestion task B køre sekventielt som uafhængige opgaver. Selvom opgaverne kører i træk, har den første og sidste fire række forskellige identitetsnøgleintervaller i dbo.Table1.Column1. Der kan også opstå huller mellem de områder, der er tildelt opgave A og opgave B.

IDENTITYi Fabric data warehouse garanterer, at alle værdier i en IDENTITY kolonne er unikke, så længe der IDENTITY_INSERT ikke bruges, men der kan opstå huller i de intervaller, der produceres til en indlæsningsopgave.

Systemmetadataobjekter

Følgende systemmetadata-objekter er tilgængelige og nyttige ved design og arbejde med identitetsværdier i Fabric data warehouse.

List identitetskolonner med sys.identity_columns systemvisning

Brug sys.identity_columns katalogvisning til at liste alle identitetskolonner i et lager. Følgende eksempel viser alle tabeller, der indeholder en IDENTITY kolonne, inklusive skema-, tabell- og identitetskolonnenavne:

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 data warehouse seed_value bliver og increment_value og kolonnerne sys.identity_columns returneret NULL og ikke opdateret efter identitetskolonnen oprettes. Kolonnen last_value returnerer NULL som standard, men skifter permanent til -1 efter den første identitetsindsættelsesoperation i tabellen.

Indsæt værdier med IDENTITY_INSERT

Som standard kan du ikke indsætte værdier i en IDENTITY kolonne. Du kan dog være nødt til at indsætte specifikke værdier under datamigration, katastrofegendannelse eller når du udfylder sentinel-værdier, for eksempel -1 for "Ukendt" i dimensionstabeller.

Brug SET IDENTITY_INSERT til midlertidigt at tillade eksplicitte indsættelser 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 udsagnet INSERT .
  • Kun én tabel pr. session kan være IDENTITY_INSERT sat til ad ON gangen.

Vigtigt!

Efter slukning IDENTITY_INSERTskal identitetsværdier sets tilbage med DBCC CHECKIDENT.

Genfrø identitetsværdier med DBCC CHECKIDENT

Efter du har indsat eksplicitte værdier med IDENTITY_INSERT, brug DBCC CHECKIDENT til at genindsætte identitetskolonnen. Operationen RESEED scanner alle brugte og reserverede identitetsintervaller på tværs af distribuerede beregningsnoder for at bestemme de korrekte næste værdier, sikre entykhed og forhindre nøglekollisioner.

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

I Fabric data warehouse DBCC CHECKIDENT understøtter kun mulighedenRESEED. Lageret bestemmer automatisk de korrekte næste værdiintervaller, og du kan ikke specificere en brugerdefineret så-værdi. For mere information, se DBCC CHECKIDENT.

Limitations

For mere information, se IDENTITY-kolonner, IDENTITY (Transact-SQL) og Opret tabeller i Warehouse i Microsoft Fabric.

  • Kun bigint-datatypen understøttes for IDENTITY kolonner i Fabric data warehouse. Andre datatyper resulterer i en fejl.
  • At definere et seed og en inkrementrate understøttes ikke. Systemet styrer værdier internt.
  • At tilføje en IDENTITY kolonne til en eksisterende tabel med understøttes ALTER TABLE ikke. Overvej at bruge CREATE TABLE AS SELECT (CTAS) eller SELECT... INTO for at oprette en kopi af en eksisterende tabel og tilføje en IDENTITY kolonne.
  • Begrænsninger gælder, hvordan IDENTITY kolonner bevares, når du opretter en tabel ved at vælge fra en anden tabel med CTAS eller SELECT...INTO. For mere information, se afsnittet om datatyper i SELECT - INTO Clause (Transact-SQL).
  • DBCC CHECKIDENT understøtter kun muligheden RESEED . At angive en brugerdefineret seed-værdi eller bruge NORESEED det understøttes ikke.
  • IDENTITY Kolonner giver værdier, der er garanteret unikke, men værdierne er ikke nødvendigvis sekventielle eller ordnede, og der kan opstå gaps.

Eksempler

A. Opret en tabel med en IDENTITY-kolonne

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

Denne sætning opretter en Employees tabel, hvor hver ny række automatisk modtager en unik EmployeeID værdi som bigint .

B. Indsæt rækker i en tabel med en identitetskolonne

Når du angiver værdier for hver ikke-identitetskolonne i deres definerede rækkefølge, behøver du ikke specificere en kolonneliste:

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

Du kan også give en kolonneliste, der udelader identitetskolonnen:

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

C. Indsæt eksplicitte værdier 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. Indsæt eksplicitte værdier med COPY INTO

Sætningen COPY INTO understøtter muligheden IDENTITY_INSERT for at indlæse eksplicitte værdier i kommandoen. COPY INTO Muligheder tilsidesætter enhver sessions-niveau indstilling 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. Genseedning af en tabel efter eksplicitte indsættelser

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

F. Opret en tabel med CREATE TABLE AS SELECT

Brug CTAS til at oprette en kopi af en tabel og bevare egenskaben IDENTITY i måltabellen:

CREATE TABLE RetiredEmployees
AS SELECT * FROM Employees;

Kolonnen i måltabellen arver egenskaben IDENTITY fra kildetabellen. For begrænsninger, se afsnittet om datatyper i SELECT - INTO Clause.

G. Opret en tabel med SELECT... IND

Brug SELECT...INTO til at oprette en kopi af en tabel og bevare egenskaben IDENTITY i måltabelen:

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

Kolonnen i måltabellen arver egenskaben IDENTITY fra kildetabellen. For begrænsninger, se afsnittet om datatyper i SELECT - INTO Clause.

Næste trin