Del via


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.

  1. 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 i dbo skjemaet, der Row_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
    );
    
  2. 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 for Row_ID kolonnen beregnes ved å konvertere verdiene som returneres av newid() funksjonen. Funksjonen krever ikke en setningsdel ORDER 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.

  1. 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 i dbo skjemaet, der Row_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
    
  2. 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;
    
  3. 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 med 1.

    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 for Row_ID kolonnen beregnes ved å legge til variabelen @MaxID i verdier som returneres av ROW_NUMBER funksjonen. Funksjonen må ha en setningsdel ORDER BY som definerer den logiske rekkefølgen for radene i resultatsettet. Når angitt til SELECT NULL, er det imidlertid ikke angitt noen logisk rekkefølge, noe som betyr at identifikatorverdier tilordnes vilkårlig. Denne ORDER 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];