在Fabric Data Warehouse中使用身份列

适用于:Microsoft Fabric 中的✅ 仓库

本教程将解释如何在Fabric Data Warehouse中使用身份列来创建和管理代理密钥。 你将了解如何创建带有标识列的表、插入数据、使用 IDENTITY_INSERT 插入显式值,以及使用 DBCC CHECKIDENT 重新设定标识范围。

先决条件

  • 具有“贡献者”或更高权限的用户可访问工作区中的仓库项目。
  • 查询工具。 本教程使用Microsoft Fabric门户中的SQL查询编辑器,但你也可以使用任何T-SQL查询工具。
  • 对T-SQL有基本了解。

什么是 IDENTITY 列?

IDENTITY 是一个数值列,可自动生成新行的唯一值。 这种行为非常适合实现代理密钥,因为每行无需手动输入即可获得唯一标识符。

创建 IDENTITY 列

要定义 IDENTITY 列,请在 IDENTITY T-SQL 语法的列定义中指定 CREATE TABLE 关键字:

CREATE TABLE { warehouse_name.schema_name.table_name | schema_name.table_name | table_name } (
    [column_name] BIGINT IDENTITY,
    [ ,... n ],
    -- Other columns here
);

使用 IDENTITY 列创建表

在这个教程中,你需要从纽约出租车开放数据集中创建一个更Trip简单的表格,并添加一TripIDIDENTITY列。 每个新行都会获得一个在表中唯一的 TripID 值。

  1. 定义一个带有 IDENTITY 列的表:

     CREATE TABLE dbo.Trip
     (
         TripID               bigint IDENTITY,
         tpepPickupDateTime   datetime2(6),
         tpepDropoffDateTime  datetime2(6),
         passengerCount       int,
         tripDistance         float,
         fareAmount           float,
         totalAmount          float
     );
    
  2. 使用 COPY INTO 将数据导入到表中。 将 COPY INTOIDENTITY 列配合使用时,请提供列列表,并将其映射到源数据列。

     COPY INTO dbo.Trip (tpepPickupDateTime, tpepDropoffDateTime, passengerCount, tripDistance, fareAmount, totalAmount)
     FROM 'https://azureopendatastorage.blob.core.windows.net/nyctlc/yellow/puYear=2013/puMonth=1/*.parquet'
     WITH( FILE_TYPE = 'PARQUET');
    
  3. 预览数据及分配给 IDENTITY 该列的值:

    SELECT TOP 10 *
    FROM Trip;
    

    输出包含每一行自动生成的 TripID 值。

    查询结果的屏幕截图,其中显示了包含出租车行程数据集前 10 行的表。

    重要

    你的价值观可能与本文中的价值观不同。 IDENTITY 列产生的值保证唯一,但这些值不一定是顺序或有序的,且可能出现空档。

  4. 使用 INSERT INTO 导入新行:

     INSERT INTO dbo.Trip
     VALUES ('2026-01-01T00:00:00', '2013-01-01T00:12:00', 1, 2.4, 10.5, 13.0);
    
  5. 列列表是可选的,可使用 INSERT INTO。 提供该项时,请指定你为其提供输入数据的所有列的名称,IDENTITY 列除外:

     INSERT INTO dbo.Trip (tpepPickupDateTime, tpepDropoffDateTime, passengerCount, tripDistance, fareAmount, totalAmount)
     VALUES ('2026-01-01T08:15:00', '2013-01-01T08:42:00', 2, 6.8, 24.5, 30.0);
    
  6. 请查看插入的行:

     SELECT *
     FROM dbo.Trip
     WHERE CAST(tpepPickupDateTime AS date) = '2026-01-01';    
    

    观察分配给新行的值:

    一张两行六列的表格截图,显示出租车行程数据。

用 IDENTITY_INSERT 插入显式数值

在数据迁移、填充哨兵值或从备份恢复数据时,可能需要在身份列中插入特定值。 使用 SET IDENTITY_INSERT 来启用这些插入。

在本节中,你创建一个维度表,并用来 IDENTITY_INSERT 添加带有已知键值的哨兵行。

  1. 创建一个带有 IDENTITY 一列的维度表:

    CREATE TABLE dbo.DimCustomer
    (
        CustomerKey BIGINT IDENTITY,
        CustomerName VARCHAR(100),
        CustomerType VARCHAR(20)
    );
    
  2. 插入常规行。 标识值会自动生成:

    INSERT INTO dbo.DimCustomer (CustomerName, CustomerType)
    VALUES ('Contoso Ltd', 'Enterprise'),
           ('Fabrikam Inc', 'SMB'),
           ('Northwind Traders', 'Enterprise');
    
  3. 启用IDENTITY_INSERT以添加哨兵值。 当 IDENTITY_INSERTON 时,提供一个包含标识列的列列表:

    SET IDENTITY_INSERT dbo.DimCustomer ON;
    
    INSERT INTO dbo.DimCustomer (CustomerKey, CustomerName, CustomerType)
    VALUES (-1, 'Unknown', 'Sentinel'),
           (-2, 'Not Applicable', 'Sentinel');
    
    SET IDENTITY_INSERT dbo.DimCustomer OFF;
    
  4. 插入显式值后,重新种入身份列, DBCC CHECKIDENT 以确保未来自动生成的值不会与插入的值发生冲突:

    DBCC CHECKIDENT('dbo.DimCustomer', RESEED);
    
  5. 验证哨兵行是否与自动生成的行一起显示:

    SELECT *
    FROM dbo.DimCustomer
    ORDER BY CustomerKey;
    
  6. 插入一行并确认自动生成的值没有冲突:

    INSERT INTO dbo.DimCustomer (CustomerName, CustomerType)
    VALUES ('Adventure Works', 'Enterprise');
    
    SELECT *
    FROM dbo.DimCustomer
    ORDER BY CustomerKey;
    

清理教程资源

可选地,可以删除本教程中创建的表格:

DROP TABLE IF EXISTS dbo.Trip;
DROP TABLE IF EXISTS dbo.DimCustomer;
DROP TABLE IF EXISTS dbo.DimProduct;