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.
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ématudbo
, kdeRow_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 );
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 sloupceRow_ID
se počítají převodem hodnot vrácenýchnewid()
funkcí. Funkce nevyžadujeORDER 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.
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ématudbo
, kdeRow_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
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;
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í na1
.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 proRow_ID
sloupec se počítají přidáním@MaxID
proměnné k hodnotám vrácenýmROW_NUMBER
funkcí. Funkce musí mítORDER BY
klauzuli, která definuje logické pořadí řádků v sadě výsledků. Pokud je však nastaveno naSELECT NULL
hodnotu , není uloženo žádné logické pořadí, což znamená, že hodnoty identifikátorů jsou libovolně přiřazeny. Výsledkem tétoORDER 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];