Поделиться через


Создание уникальных идентификаторов в таблице хранилища в Microsoft Fabric

Область применения:✅ хранилище в Microsoft Fabric

Это общее требование в хранилищах данных для назначения уникального идентификатора каждой строке таблицы. В средах на основе SQL Server это обычно делается путем создания столбца удостоверений в таблице, однако в настоящее время эта функция не поддерживается в хранилище в Microsoft Fabric. Вместо этого необходимо использовать метод обходного решения. Мы представляем два варианта.

В этой статье описываются методы обходного решения для создания уникальных идентификаторов в таблице хранилища.

Метод 1

Этот метод наиболее применим, если требуется создать значения удостоверения, но порядок значений не важен (допустимы нецеденциальные значения).

Уникальные значения создаются в коде, который вставляет данные в таблицу.

  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
    );
    
  2. При вставке строк в таблицу с помощью скриптов 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.

Этот метод наиболее применим, если необходимо создать последовательные значения идентификации, но следует использовать с осторожностью для больших наборов данных, так как это может быть медленнее, чем альтернативные методы. Рекомендации также следует учитывать для нескольких процессов, вставляющих данные одновременно, так как это может привести к повторяющимся значениям.

  1. Чтобы создать уникальные данные с помощью этого метода, создайте таблицу, содержащую столбец, в который хранятся уникальные значения идентификаторов. Тип данных столбца должен иметь значение 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
    
  2. Прежде чем вставлять строки в таблицу, необходимо определить последнее значение идентификатора, хранящееся в таблице. Это можно сделать, извлекая максимальное значение идентификатора. Это значение должно быть назначено переменной, чтобы вы могли ссылаться на нее при вставке строк таблицы (на следующем шаге).

    Следующий код назначает последнее значение идентификатора переменной с именем @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. При вставке строк в таблицу уникальные и последовательные числа вычисляются путем добавления значения переменной @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];