Generowanie unikatowych identyfikatorów w tabeli magazynu w usłudze Microsoft Fabric
Dotyczy:✅ Magazyn w usłudze Microsoft Fabric
Typowym wymaganiem w magazynach danych jest przypisanie unikatowego identyfikatora do każdego wiersza tabeli. W środowiskach opartych na programie SQL Server zazwyczaj jest to wykonywane przez utworzenie kolumny tożsamości w tabeli, jednak obecnie ta funkcja nie jest obsługiwana w magazynie w usłudze Microsoft Fabric. Zamiast tego należy użyć techniki obejścia. Przedstawiamy dwie alternatywy.
W tym artykule opisano techniki obejścia służące do generowania unikatowych identyfikatorów w tabeli magazynu.
Metoda 1
Ta metoda jest najbardziej odpowiednia w przypadku konieczności utworzenia wartości tożsamości, ale kolejność wartości nie jest ważna (wartości inne niż wartości są dopuszczalne).
Unikatowe wartości są generowane w kodzie, który wstawia dane do tabeli.
Aby utworzyć unikatowe dane przy użyciu tej metody, utwórz tabelę zawierającą kolumnę przechowującą unikatowe wartości identyfikatorów. Typ danych kolumny powinien być ustawiony na bigint. Należy również zdefiniować kolumnę tak
NOT NULL
, aby upewnić się, że każdy wiersz ma przypisany identyfikator.Poniższy przykładowy kod języka T-SQL tworzy przykładową tabelę o nazwie
Orders_with_Identifier
w schemaciedbo
, gdzie kolumnaRow_ID
służy jako unikatowy klucz.--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 );
W przypadku wstawiania wierszy do tabeli za pomocą skryptów języka T-SQL lub kodu aplikacji lub w inny sposób wygeneruj unikatowe dane dla
Row_ID
funkcjiNEWID()
. Ta funkcja generuje unikatową wartość typu uniqueidentifier , która następnie może być rzutowana i przechowywana jako bigint.Poniższy kod wstawia wiersze do
dbo.Orders_with_Identifier
tabeli. Wartości kolumnyRow_ID
są obliczane przez przekonwertowanie wartości zwracanych przeznewid()
funkcję. Funkcja nie wymaga klauzuliORDER BY
i generuje nową wartość dla każdego rekordu.--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
Ta metoda jest najbardziej odpowiednia, gdy trzeba utworzyć sekwencyjne wartości tożsamości, ale należy zachować ostrożność w przypadku większych zestawów danych, ponieważ może być wolniejsza niż metody alternatywne. Należy również wziąć pod uwagę wiele procesów wstawiania danych jednocześnie, ponieważ może to prowadzić do zduplikowanych wartości.
Aby utworzyć unikatowe dane przy użyciu tej metody, utwórz tabelę zawierającą kolumnę przechowującą unikatowe wartości identyfikatorów. Typ danych kolumny powinien być ustawiony na wartość int lub bigint, w zależności od ilości danych, które mają być przechowywane. Należy również zdefiniować kolumnę tak
NOT NULL
, aby upewnić się, że każdy wiersz ma przypisany identyfikator.Poniższy przykładowy kod języka T-SQL tworzy przykładową tabelę o nazwie
Orders_with_Identifier
w schemaciedbo
, gdzie kolumnaRow_ID
służy jako unikatowy klucz.--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
Przed wstawieniem wierszy do tabeli należy określić ostatnią wartość identyfikatora przechowywaną w tabeli. Można to zrobić, pobierając maksymalną wartość identyfikatora. Ta wartość powinna zostać przypisana do zmiennej, aby można było odwoływać się do niej podczas wstawiania wierszy tabeli (w następnym kroku).
Poniższy kod przypisuje ostatnią wartość identyfikatora do zmiennej o nazwie
@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;
Podczas wstawiania wierszy do tabeli obliczane są unikatowe i sekwencyjne liczby przez dodanie wartości
@MaxID
zmiennej do wartości zwracanych przez funkcję ROW_NUMBER . Ta funkcja jest funkcją okna, która oblicza sekwencyjny numer wiersza rozpoczynający się od1
.Poniższy kod języka T-SQL , który jest uruchamiany w tej samej partii co skrypt w kroku 2, wstawia wiersze do
Orders_with_Identifier
tabeli. Wartości kolumnyRow_ID
są obliczane przez dodanie zmiennej@MaxID
ROW_NUMBER
do wartości zwracanych przez funkcję. Funkcja musi mieć klauzulęORDER BY
, która definiuje kolejność logiczną wierszy w zestawie wyników. Jednak po ustawieniuSELECT NULL
wartości na wartość nie zostanie nałożona żadna kolejność logiczna, co oznacza, że wartości identyfikatorów są dowolnie przypisywane. TaORDER BY
klauzula powoduje skrócenie czasu wykonywania.--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];