共用方式為


在 Microsoft Fabric 的倉儲資料表中產生唯一識別碼

適用於✅:Microsoft Fabric 的倉儲

這是資料倉儲中將唯一識別碼指派給資料表每個資料列的常見需求。 在 SQL Server 型環境中,這通常是藉由在數據表中建立 識別數據行 來完成,不過目前在 Microsoft Fabric 的倉儲中不支援此功能。 相反地,您必須使用因應措施技術。 我們提供了兩個替代方案。

本文說明在倉儲數據表中產生唯一標識符的因應措施技術。

方法 1

當您需要建立識別值時,此方法最適用,但值的順序並不重要(非查詢值是可接受的)。

唯一值會在將數據插入數據表的程式代碼中產生。

  1. 若要使用此方法建立唯一數據,請建立包含儲存唯一標識符值之數據行的數據表。 數據行數據類型應該設定為 bigint。 您也應將資料行定義為 NOT NULL,以確保為每個資料列指派識別碼。

    下列 T-SQL 程式代碼範例會在架構中建立名為 Orders_with_Identifierdbo 範例數據表,其中數據 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_IDNEWID()。 此函式會產生 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_Identifierdbo 範例數據表,其中數據 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_IdentifierRow_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];