Generer unike identifikatorer i en lagertabell i Microsoft Fabric
Gjelder for:✅ Lager i Microsoft Fabric
Det er et vanlig krav i datalager for å tilordne en unik identifikator til hver rad i en tabell. I SQL Server-baserte miljøer gjøres dette vanligvis ved å opprette en identitetskolonne i en tabell, men for øyeblikket støttes ikke denne funksjonen i et lager i Microsoft Fabric. I stedet må du bruke en løsningsteknikk. Vi presenterer to alternativer.
Denne artikkelen beskriver løsningsteknikker for å generere unike identifikatorer i en lagertabell.
Metode 1
Denne metoden er mest aktuell når du må opprette identitetsverdier, men rekkefølgen på verdiene er ikke viktig (ikke-sekvensielle verdier er akseptable).
Unike verdier genereres i koden som setter inn data i tabellen.
Hvis du vil opprette unike data ved hjelp av denne metoden, oppretter du en tabell som inneholder en kolonne som lagrer unike identifikatorverdier. Kolonnedatatypen må settes til bigint. Du bør også definere kolonnen som
NOT NULL
å sikre at hver rad er tilordnet en identifikator.Følgende eksempel på T-SQL-kode oppretter en eksempeltabell med navnet
Orders_with_Identifier
idbo
skjemaet, derRow_ID
kolonnen fungerer som en unik nøkkel.--Drop a table named 'Orders_with_Identifier' in schema 'dbo', if it exists IF OBJECT_ID('[dbo].[Orders_with_Identifier]', 'U') IS NOT NULL DROP TABLE [dbo].[Orders_with_Identifier]; GO CREATE TABLE [dbo].[Orders_with_Identifier] ( [Row_ID] BIGINT NOT NULL, [O_OrderKey] BIGINT NULL, [O_CustomerKey] BIGINT NULL, [O_OrderStatus] VARCHAR(1) NULL, [O_TotalPrice] DECIMAL(15, 2) NULL, [O_OrderDate] DATE NULL, [O_OrderPriority] VARCHAR(15) NULL, [O_Clerk] VARCHAR (15) NULL, [O_ShipPriority] INT NULL, [O_Comment] VARCHAR (79) NULL );
Når du setter inn rader i tabellen, genererer du unike data
Row_ID
NEWID()
for funksjonen via T-SQL-skript eller programkode eller annet. Denne funksjonen genererer en unik verdi av typen uniqueidentifier som deretter kan kastes og lagres som en bigint.Følgende kode setter inn rader i tabellen
dbo.Orders_with_Identifier
. Verdiene forRow_ID
kolonnen beregnes ved å konvertere verdiene som returneres avnewid()
funksjonen. Funksjonen krever ikke en setningsdelORDER BY
og genererer en ny verdi for hver post.--Insert new rows with unique identifiers INSERT INTO [dbo].[Orders_with_Identifier] SELECT CONVERT(BIGINT, CONVERT(VARBINARY, CONCAT(NEWID(), GETDATE()))) AS [Row_ID], [src].[O_OrderKey], [src].[O_CustomerKey], [src].[O_OrderStatus], [src].[O_TotalPrice], [src].[O_OrderDate], [src].[O_OrderPriority], [src].[O_Clerk], [src].[O_ShipPriority], [src].[O_Comment] FROM [dbo].[Orders] AS [src];
Metode 2
Denne metoden er mest aktuell når du trenger å opprette sekvensielle identitetsverdier, men bør brukes med forsiktighet på større datasett, da det kan være tregere enn alternative metoder. Det bør også tas hensyn til flere prosesser som setter inn data samtidig, da dette kan føre til dupliserte verdier.
Hvis du vil opprette unike data ved hjelp av denne metoden, oppretter du en tabell som inneholder en kolonne som lagrer unike identifikatorverdier. Kolonnedatatypen må settes til int eller bigint, avhengig av datavolumet du forventer å lagre. Du bør også definere kolonnen som
NOT NULL
å sikre at hver rad er tilordnet en identifikator.Følgende eksempel på T-SQL-kode oppretter en eksempeltabell med navnet
Orders_with_Identifier
idbo
skjemaet, derRow_ID
kolonnen fungerer som en unik nøkkel.--Drop a table named 'Orders_with_Identifier' in schema 'dbo', if it exists IF OBJECT_ID('[dbo].[Orders_with_Identifier]', 'U') IS NOT NULL DROP TABLE [dbo].[Orders_with_Identifier]; GO CREATE TABLE [dbo].[Orders_with_Identifier] ( [Row_ID] BIGINT NOT NULL, [O_OrderKey] BIGINT NULL, [O_CustomerKey] BIGINT NULL, [O_OrderStatus] VARCHAR(1) NULL, [O_TotalPrice] DECIMAL(15, 2) NULL, [O_OrderDate] DATE NULL, [O_OrderPriority] VARCHAR(15) NULL, [O_Clerk] VARCHAR (15) NULL, [O_ShipPriority] INT NULL, [O_Comment] VARCHAR (79) NULL ); GO
Før du setter inn rader i tabellen, må du bestemme den siste identifikatorverdien som er lagret i tabellen. Du kan gjøre dette ved å hente den maksimale identifikatorverdien. Denne verdien må tilordnes til en variabel, slik at du kan referere til den når du setter inn tabellrader (i neste trinn).
Følgende kode tilordner den siste identifikatorverdien til en variabel med navnet
@MaxID
.--Assign the last identifier value to a variable --If the table doesn't contain any rows, assign zero to the variable DECLARE @MaxID AS BIGINT; IF EXISTS(SELECT * FROM [dbo].[Orders_with_Identifier]) SET @MaxID = (SELECT MAX([Row_ID]) FROM [dbo].[Orders_with_Identifier]); ELSE SET @MaxID = 0;
Når du setter inn rader i tabellen, beregnes unike og sekvensielle tall ved å legge til verdien for variabelen
@MaxID
i verdiene som returneres av ROW_NUMBER-funksjonen . Denne funksjonen er en vindusfunksjon som beregner et sekvensielt radnummer som starter med1
.Følgende T-SQL-kode – som kjøres i samme gruppe som skriptet i trinn 2 – setter inn rader i
Orders_with_Identifier
tabellen. Verdiene forRow_ID
kolonnen beregnes ved å legge til variabelen@MaxID
i verdier som returneres avROW_NUMBER
funksjonen. Funksjonen må ha en setningsdelORDER BY
som definerer den logiske rekkefølgen for radene i resultatsettet. Når angitt tilSELECT NULL
, er det imidlertid ikke angitt noen logisk rekkefølge, noe som betyr at identifikatorverdier tilordnes vilkårlig. DenneORDER BY
setningen resulterer i raskere kjøringstid.--Insert new rows with unique identifiers INSERT INTO [dbo].[Orders_with_Identifier] SELECT @MaxID + ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS [Row_ID], [src].[O_OrderKey], [src].[O_CustomerKey], [src].[O_OrderStatus], [src].[O_TotalPrice], [src].[O_OrderDate], [src].[O_OrderPriority], [src].[O_Clerk], [src].[O_ShipPriority], [src].[O_Comment] FROM [dbo].[Orders] AS [src];