在 Microsoft Fabric 的仓库表中生成唯一标识符
适用于:✅Microsoft Fabric 中的仓库
在数据仓库中,通常需要为表中的每一行分配唯一标识符。 在基于 SQL Server 的环境中,该操作通常通过在表中创建“标识列”来完成,但 Microsoft Fabric 中的仓库目前不支持此功能。 而你需要使用一种变通方法。 我们提供了两种替代方案。
本文介绍在仓库表中生成唯一标识符的变通方法。
方法 1
当你需要创建标识值,但值的顺序并不重要(可接受不连续的值)时,此方法最适用。
将数据插入表中的代码中会生成唯一值。
若要使用此方法创建唯一数据,请创建包含存储唯一标识符值的列的表。 列数据类型应设置为 bigint。 你还应该将列定义为
NOT NULL
,以确保为每一行分配一个标识符。以下 T-SQL 示例代码在
dbo
架构中创建一个名为Orders_with_Identifier
的示例表,其中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 脚本或应用程序代码或其他方式在表中插入行时,使用
NEWID()
函数生成Row_ID
的唯一数据。 此函数生成 uniqueidentifier 类型的唯一值,该值可以强制转换并存储为 bigint。以下代码将行插入
dbo.Orders_with_Identifier
表中。 将通过转换newid()
函数返回的值来计算Row_ID
列的值。 该函数不需要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 示例代码在
dbo
架构中创建一个名为Orders_with_Identifier
的示例表,其中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];