Создание уникальных идентификаторов в таблице хранилища в Microsoft Fabric
Область применения:✅ хранилище в Microsoft Fabric
Это общее требование в хранилищах данных для назначения уникального идентификатора каждой строке таблицы. В средах на основе SQL Server это обычно делается путем создания столбца удостоверений в таблице, однако в настоящее время эта функция не поддерживается в хранилище в Microsoft Fabric. Вместо этого необходимо использовать метод обходного решения. Мы представляем два варианта.
В этой статье описываются методы обходного решения для создания уникальных идентификаторов в таблице хранилища.
Метод 1
Этот метод наиболее применим, если требуется создать значения удостоверения, но порядок значений не важен (допустимы нецеденциальные значения).
Уникальные значения создаются в коде, который вставляет данные в таблицу.
Чтобы создать уникальные данные с помощью этого метода, создайте таблицу, содержащую столбец, в который хранятся уникальные значения идентификаторов. Тип данных столбца должен иметь значение bigint. Необходимо также определить столбец,
NOT NULL
чтобы убедиться, что каждая строка назначена идентификатору.В следующем примере кода T-SQL создается пример таблицы с именем
Orders_with_Identifier
в схемеdbo
, гдеRow_ID
столбец служит уникальным ключом.--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 );
При вставке строк в таблицу с помощью скриптов T-SQL или кода приложения или в противном случае создайте уникальные данные
Row_ID
дляNEWID()
функции. Эта функция создает уникальное значение уникального типа uniqueidentifier , которое затем можно привести и сохранить как bigint.Следующий код вставляет строки в таблицу
dbo.Orders_with_Identifier
. Значения дляRow_ID
столбца вычисляются путем преобразования значений, возвращаемых функциейnewid()
. Функция не требуетORDER BY
предложения и создает новое значение для каждой записи.--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];
Метод 2.
Этот метод наиболее применим, если необходимо создать последовательные значения идентификации, но следует использовать с осторожностью для больших наборов данных, так как это может быть медленнее, чем альтернативные методы. Рекомендации также следует учитывать для нескольких процессов, вставляющих данные одновременно, так как это может привести к повторяющимся значениям.
Чтобы создать уникальные данные с помощью этого метода, создайте таблицу, содержащую столбец, в который хранятся уникальные значения идентификаторов. Тип данных столбца должен иметь значение int или bigint в зависимости от объема данных, которые требуется хранить. Необходимо также определить столбец,
NOT NULL
чтобы убедиться, что каждая строка назначена идентификатору.В следующем примере кода T-SQL создается пример таблицы с именем
Orders_with_Identifier
в схемеdbo
, гдеRow_ID
столбец служит уникальным ключом.--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
Прежде чем вставлять строки в таблицу, необходимо определить последнее значение идентификатора, хранящееся в таблице. Это можно сделать, извлекая максимальное значение идентификатора. Это значение должно быть назначено переменной, чтобы вы могли ссылаться на нее при вставке строк таблицы (на следующем шаге).
Следующий код назначает последнее значение идентификатора переменной с именем
@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;
При вставке строк в таблицу уникальные и последовательные числа вычисляются путем добавления значения переменной
@MaxID
в значения, возвращаемые функцией ROW_NUMBER . Эта функция представляет собой функцию окна, которая вычисляет последовательный номер строки, начиная с1
.Следующий код T-SQL, который выполняется в том же пакете, что и скрипт на шаге 2, вставляет строки в таблицу
Orders_with_Identifier
. Значения столбцаRow_ID
вычисляются путем добавления@MaxID
переменной в значения, возвращаемыеROW_NUMBER
функцией. Функция должна иметьORDER BY
предложение, определяющее логический порядок строк в результирующем наборе. Однако если заданоSELECT NULL
значение , логический порядок не вводится, то есть значения идентификатора присваиваются произвольно. ЭтоORDER BY
предложение приводит к более быстрому выполнению.--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];