Sdílet prostřednictvím


Generování jedinečných identifikátorů v tabulce skladu v Microsoft Fabric

Platí pro:✅ Warehouse v Microsoft Fabric

V datových skladech je běžný požadavek na přiřazení jedinečného identifikátoru ke každému řádku tabulky. V prostředích založených na SQL Serveru se to obvykle provádí vytvořením sloupce identity v tabulce, ale tato funkce se v současné době nepodporuje ve skladu v Microsoft Fabric. Místo toho musíte použít techniku alternativního řešení. Prezentujeme dvě alternativy.

Tento článek popisuje techniky alternativního řešení pro generování jedinečných identifikátorů v tabulce skladu.

Metoda 1

Tato metoda je nejvhodnější v případě, že potřebujete vytvořit hodnoty identity, ale pořadí hodnot není důležité (neekvenční hodnoty jsou přijatelné).

Jedinečné hodnoty se generují v kódu, který vkládá data do tabulky.

  1. Pokud chcete vytvořit jedinečná data pomocí této metody, vytvořte tabulku obsahující sloupec, který ukládá hodnoty jedinečného identifikátoru. Datový typ sloupce by měl být nastavený na bigint. Sloupec byste také měli definovat tak, aby NOT NULL se zajistilo, že každý řádek má přiřazený identifikátor.

    Následující ukázka kódu T-SQL vytvoří ukázkovou tabulku pojmenovanou Orders_with_Identifier ve schématu dbo , kde Row_ID sloupec slouží jako jedinečný klíč.

    --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. Při vkládání řádků do tabulky prostřednictvím skriptů T-SQL nebo kódu aplikace nebo jinak vygenerujte jedinečná data pro Row_ID NEWID() funkci. Tato funkce vygeneruje jedinečnou hodnotu typu uniqueidentifier , která se pak dá přetypovat a uložit jako bigint.

    Následující kód vloží řádky do dbo.Orders_with_Identifier tabulky. Hodnoty sloupce Row_ID se počítají převodem hodnot vrácených newid() funkcí. Funkce nevyžaduje ORDER BY klauzuli a pro každý záznam vygeneruje novou hodnotu.

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

Metoda 2

Tato metoda je nejvhodnější, pokud potřebujete vytvořit sekvenční hodnoty identity, ale měli byste ji používat s opatrností u větších datových sad, protože může být pomalejší než alternativní metody. Je třeba vzít v úvahu také několik procesů, které současně vkládají data, protože by to mohlo vést k duplicitním hodnotám.

  1. Pokud chcete vytvořit jedinečná data pomocí této metody, vytvořte tabulku obsahující sloupec, který ukládá hodnoty jedinečného identifikátoru. Datový typ sloupce by měl být nastavený na int nebo bigint v závislosti na objemu dat, která očekáváte uložit. Sloupec byste také měli definovat tak, aby NOT NULL se zajistilo, že každý řádek má přiřazený identifikátor.

    Následující ukázka kódu T-SQL vytvoří ukázkovou tabulku pojmenovanou Orders_with_Identifier ve schématu dbo , kde Row_ID sloupec slouží jako jedinečný klíč.

    --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. Před vložením řádků do tabulky je potřeba určit poslední hodnotu identifikátoru uloženou v tabulce. Můžete to udělat načtením maximální hodnoty identifikátoru. Tato hodnota by měla být přiřazena proměnné, abyste na ni mohli odkazovat při vkládání řádků tabulky (v dalším kroku).

    Následující kód přiřadí poslední hodnotu identifikátoru proměnné s názvem @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. Když do tabulky vložíte řádky, vypočítá se jedinečná a sekvenční čísla přidáním hodnoty @MaxID proměnné k hodnotám vráceným funkcí ROW_NUMBER . Tato funkce je funkce okna, která vypočítá pořadové číslo řádku začínající na 1.

    Následující kód T-SQL, který se spouští ve stejné dávce jako skript v kroku 2, vloží řádky do Orders_with_Identifier tabulky. Hodnoty pro Row_ID sloupec se počítají přidáním @MaxID proměnné k hodnotám vráceným ROW_NUMBER funkcí. Funkce musí mít ORDER BY klauzuli, která definuje logické pořadí řádků v sadě výsledků. Pokud je však nastaveno na SELECT NULLhodnotu , není uloženo žádné logické pořadí, což znamená, že hodnoty identifikátorů jsou libovolně přiřazeny. Výsledkem této ORDER BY klauzule je rychlejší doba provádění.

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