Delen via


Unieke id's genereren in een magazijntabel in Microsoft Fabric

Van toepassing op:✅ Warehouse in Microsoft Fabric

Het is een algemene vereiste in datawarehouses om een unieke id toe te wijzen aan elke rij van een tabel. In sql Server-omgevingen wordt dit meestal gedaan door een identiteitskolom in een tabel te maken, maar op dit moment wordt deze functie niet ondersteund in een magazijn in Microsoft Fabric. In plaats daarvan moet u een tijdelijke oplossingstechniek gebruiken. We presenteren twee alternatieven.

In dit artikel worden tijdelijke oplossingen beschreven voor het genereren van unieke id's in een magazijntabel.

Methode 1

Deze methode is het meest van toepassing wanneer u identiteitswaarden moet maken, maar de volgorde van de waarden is niet belangrijk (niet-opeenvolgende waarden zijn acceptabel).

Unieke waarden worden gegenereerd in de code waarmee gegevens in de tabel worden ingevoegd.

  1. Als u unieke gegevens wilt maken met deze methode, maakt u een tabel met een kolom waarin unieke id-waarden worden opgeslagen. Het gegevenstype van de kolom moet worden ingesteld op bigint. U moet ook de kolom NOT NULL definiëren om ervoor te zorgen dat aan elke rij een id wordt toegewezen.

    In het volgende T-SQL-codevoorbeeld wordt een voorbeeldtabel gemaakt met de naam Orders_with_Identifier in het dbo schema, waarbij de Row_ID kolom fungeert als een unieke sleutel.

    --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. Wanneer u rijen in de tabel invoegt, via T-SQL-scripts of toepassingscode of anderszins, genereert u unieke gegevens voor Row_ID de NEWID() functie. Deze functie genereert een unieke waarde van het type uniqueidentifier die vervolgens als bigint kan worden gecast en opgeslagen.

    Met de volgende code worden rijen in de dbo.Orders_with_Identifier tabel ingevoegd. De waarden voor de Row_ID kolom worden berekend door de waarden te converteren die door de newid() functie worden geretourneerd. Voor de functie is geen component vereist ORDER BY en wordt voor elke record een nieuwe waarde gegenereerd.

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

Methode 2

Deze methode is het meest van toepassing wanneer u sequentiële identiteitswaarden moet maken, maar moet voorzichtig worden gebruikt voor grotere gegevenssets, omdat deze langzamer kunnen zijn dan alternatieve methoden. Er moeten ook overwegingen worden gemaakt voor meerdere processen die tegelijkertijd gegevens invoegen, omdat dit kan leiden tot dubbele waarden.

  1. Als u unieke gegevens wilt maken met deze methode, maakt u een tabel met een kolom waarin unieke id-waarden worden opgeslagen. Het gegevenstype van de kolom moet worden ingesteld op int of bigint, afhankelijk van het gegevensvolume dat u verwacht op te slaan. U moet ook de kolom NOT NULL definiëren om ervoor te zorgen dat aan elke rij een id wordt toegewezen.

    In het volgende T-SQL-codevoorbeeld wordt een voorbeeldtabel gemaakt met de naam Orders_with_Identifier in het dbo schema, waarbij de Row_ID kolom fungeert als een unieke sleutel.

    --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. Voordat u rijen in de tabel invoegt, moet u de laatste id-waarde bepalen die in de tabel is opgeslagen. U kunt dit doen door de maximum-id-waarde op te halen. Deze waarde moet worden toegewezen aan een variabele, zodat u ernaar kunt verwijzen wanneer u tabelrijen invoegt (in de volgende stap).

    Met de volgende code wordt de laatste id-waarde toegewezen aan een variabele met de naam @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. Wanneer u rijen invoegt in de tabel, worden unieke en opeenvolgende getallen berekend door de waarde van de @MaxID variabele toe te voegen aan de waarden die worden geretourneerd door de functie ROW_NUMBER . Deze functie is een vensterfunctie waarmee een opeenvolgend rijnummer wordt berekend dat begint met 1.

    De volgende T-SQL-code, die wordt uitgevoerd in dezelfde batch als het script in stap 2, voegt rijen in de Orders_with_Identifier tabel in. De waarden voor de Row_ID kolom worden berekend door de @MaxID variabele toe te voegen aan waarden die door de ROW_NUMBER functie worden geretourneerd. De functie moet een ORDER BY component hebben, waarmee de logische volgorde van de rijen in de resultatenset wordt gedefinieerd. Wanneer dit is ingesteld op SELECT NULL, wordt er echter geen logische volgorde opgelegd, wat betekent dat id-waarden willekeurig worden toegewezen. Deze ORDER BY component resulteert in een snellere uitvoeringstijd.

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