适用于: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 值。
定义一个带有
IDENTITY列的表:CREATE TABLE dbo.Trip ( TripID bigint IDENTITY, tpepPickupDateTime datetime2(6), tpepDropoffDateTime datetime2(6), passengerCount int, tripDistance float, fareAmount float, totalAmount float );使用
COPY INTO将数据导入到表中。 将COPY INTO与IDENTITY列配合使用时,请提供列列表,并将其映射到源数据列。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');预览数据及分配给
IDENTITY该列的值:SELECT TOP 10 * FROM Trip;输出包含每一行自动生成的
TripID值。重要
你的价值观可能与本文中的价值观不同。
IDENTITY列产生的值保证唯一,但这些值不一定是顺序或有序的,且可能出现空档。使用
INSERT INTO导入新行:INSERT INTO dbo.Trip VALUES ('2026-01-01T00:00:00', '2013-01-01T00:12:00', 1, 2.4, 10.5, 13.0);列列表是可选的,可使用
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);请查看插入的行:
SELECT * FROM dbo.Trip WHERE CAST(tpepPickupDateTime AS date) = '2026-01-01';观察分配给新行的值:
用 IDENTITY_INSERT 插入显式数值
在数据迁移、填充哨兵值或从备份恢复数据时,可能需要在身份列中插入特定值。 使用 SET IDENTITY_INSERT 来启用这些插入。
在本节中,你创建一个维度表,并用来 IDENTITY_INSERT 添加带有已知键值的哨兵行。
创建一个带有
IDENTITY一列的维度表:CREATE TABLE dbo.DimCustomer ( CustomerKey BIGINT IDENTITY, CustomerName VARCHAR(100), CustomerType VARCHAR(20) );插入常规行。 标识值会自动生成:
INSERT INTO dbo.DimCustomer (CustomerName, CustomerType) VALUES ('Contoso Ltd', 'Enterprise'), ('Fabrikam Inc', 'SMB'), ('Northwind Traders', 'Enterprise');启用
IDENTITY_INSERT以添加哨兵值。 当IDENTITY_INSERT为ON时,提供一个包含标识列的列列表: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;插入显式值后,重新种入身份列,
DBCC CHECKIDENT以确保未来自动生成的值不会与插入的值发生冲突:DBCC CHECKIDENT('dbo.DimCustomer', RESEED);验证哨兵行是否与自动生成的行一起显示:
SELECT * FROM dbo.DimCustomer ORDER BY CustomerKey;插入一行并确认自动生成的值没有冲突:
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;