Del via


Generér entydige id'er i en lagertabel i Microsoft Fabric

Gælder for:✅ Warehouse i Microsoft Fabric

Det er et almindeligt krav i data warehouses at tildele en entydig identifikator til hver række i en tabel. I SQL Server-baserede miljøer gøres dette typisk ved at oprette en identitetskolonne i en tabel, men denne funktion understøttes i øjeblikket ikke i et lager i Microsoft Fabric. Du skal i stedet bruge en løsningsteknik. Vi præsenterer to alternativer.

I denne artikel beskrives løsninger til generering af entydige id'er i en lagertabel.

Metode 1

Denne metode er mest relevant, når du har brug for at oprette identitetsværdier, men rækkefølgen af værdierne er ikke vigtig (ikke-sekventielle værdier er acceptable).

Der genereres entydige værdier i den kode, der indsætter data i tabellen.

  1. Hvis du vil oprette entydige data ved hjælp af denne metode, skal du oprette en tabel, der indeholder en kolonne, der gemmer entydige id-værdier. Kolonnedatatypen skal angives til bigint. Du skal også definere kolonnen for NOT NULL at sikre, at hver række tildeles et id.

    Følgende T-SQL-kodeeksempel opretter en eksempeltabel, der er navngivet Orders_with_Identifier i skemaet dbo , hvor kolonnen Row_ID fungerer som en entydig nøgle.

    --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 indsætter rækker i tabellen via T-SQL-scripts eller programkode eller på anden måde, genererer du entydige data for Row_ID med funktionen NEWID() . Denne funktion genererer en entydig værdi af typen uniqueidentifier , som derefter kan castes og gemmes som en bigint.

    Følgende kode indsætter rækker i dbo.Orders_with_Identifier tabellen. Værdierne for kolonnen Row_ID beregnes ved at konvertere de værdier, der returneres af funktionen newid() . Funktionen kræver ikke en ORDER BY delsætning og genererer en ny værdi 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 metode er mest relevant, når du har brug for at oprette sekventielle identitetsværdier, men skal bruges med forsigtighed på større datasæt, da den kan være langsommere end alternative metoder. Der skal også tages hensyn til flere processer, der indsætter data samtidigt, da dette kan føre til dubletværdier.

  1. Hvis du vil oprette entydige data ved hjælp af denne metode, skal du oprette en tabel, der indeholder en kolonne, der gemmer entydige id-værdier. Kolonnedatatypen skal angives til int eller bigint, afhængigt af mængden af data, du forventer at gemme. Du skal også definere kolonnen for NOT NULL at sikre, at hver række tildeles et id.

    Følgende T-SQL-kodeeksempel opretter en eksempeltabel, der er navngivet Orders_with_Identifier i skemaet dbo , hvor kolonnen Row_ID fungerer som en entydig nøgle.

    --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 indsætter rækker i tabellen, skal du bestemme den sidste id-værdi, der er gemt i tabellen. Det kan du gøre ved at hente den maksimale id-værdi. Denne værdi skal tildeles til en variabel, så du kan referere til den, når du indsætter tabelrækker (i næste trin).

    Følgende kode tildeler den sidste id-værdi 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 indsætter rækker i tabellen, beregnes entydige og sekventielle tal ved at føje variablens @MaxID værdi til de værdier, der returneres af funktionen ROW_NUMBER . Denne funktion er en vinduesfunktion, der beregner et sekventielt rækkenummer, der starter med 1.

    Følgende T-SQL-kode – som køres i samme batch som scriptet i trin 2 – indsætter rækker i tabellen Orders_with_Identifier . Værdierne for Row_ID kolonnen beregnes ved at føje variablen @MaxID til værdier, der returneres af funktionen ROW_NUMBER . Funktionen skal have en ORDER BY delsætning, som definerer den logiske rækkefølge af rækkerne i resultatsættet. Men når den er angivet til SELECT NULL, pålægges der ingen logisk rækkefølge, hvilket betyder, at id-værdier tildeles vilkårligt. Denne ORDER BY delsætning resulterer i en hurtigere udførelsestid.

    --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];