IDENTITY 列

适用于:Microsoft Fabric 中的✅ 仓库

代理项是数据仓库中使用的标识符,用于唯一区分行,独立于其自然键。 在 Fabric 数据仓库中,在向表中插入新行时, IDENTITY 列可以自动生成这些代理项键。 本文介绍如何使用 IDENTITY Fabric 数据仓库中的列高效创建和管理代理键。

为何使用 IDENTITY 列?

IDENTITY 列无需手动分配密钥,降低错误风险并简化数据引入。 由系统管理的唯一值是代理键和主键的理想选择。 与手动生成代理键的方法相比,IDENTITY 列的性能更为卓越,因为其可自动生成唯一键,而无需对查询执行额外的逻辑。

列中所需的bigint数据类型最多可以存储9,223,372,036,854,775,807个正整数值,确保在整个表的生存期内,每行在其IDENTITY列中接收独特的值。

有关使用代理键从其他数据库平台迁移数据的计划,请参阅 将 IDENTITY 列迁移到 Fabric 数据仓库

Syntax

若要在 Fabric 数据仓库中定义列 IDENTITY ,该 IDENTITY 属性与所需列一起使用。 语法如下所示:

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

IDENTITY 列的工作原理

在 Fabric 数据仓库中,不能指定自定义起始值或增量;系统在内部管理值,以确保唯一性。 IDENTITY 列始终生成正整数值。 每个新行都会收到一个新值,只要表存在,就保证唯一性。 使用值后, IDENTITY 不会再次使用相同的值,同时保留键完整性和唯一性。 可以在 IDENTITY 列生成的值之间出现空白。

值分配

由于仓库引擎的分布式体系结构, IDENTITY 属性不能保证分配代理项值的顺序。 该 IDENTITY 属性旨在跨计算节点横向扩展,以最大化并行度,而不会影响负载性能。 因此,不同引入任务上的值范围可能具有不同的序列范围。

若要说明此行为,请考虑以下示例:

-- Create a table with an IDENTITY column
CREATE TABLE dbo.T1(
    C1 BIGINT IDENTITY,
    C2 VARCHAR(30) NULL
)

-- Ingestion task A
INSERT INTO dbo.T1
VALUES (NULL), (NULL), (NULL), (NULL);

-- Ingestion task B
INSERT INTO dbo.T1
VALUES (NULL), (NULL), (NULL), (NULL);

-- Reviewing the data
SELECT * FROM dbo.T1;

示例结果:

一个表,其中两列标记为 C1 和 C2,显示八行数据。列 C1 包含较大的数值。列 C2 包含文本。

在此示例中, Ingestion task AIngestion task B 按顺序执行独立任务。 尽管任务是连续运行的,但在dbo.T1.C1中,首行和最后四行具有不同的标识键范围。 除此之外,正如本示例所示,为任务 A 和任务 B 分配的范围之间可能会出现差距。

IDENTITY 在 Fabric 数据仓库中保证列上的 IDENTITY 所有值都是唯一的,但给定的导入任务生成的范围之间可能会有空隙。

系统视图

sys.identity_columns目录视图可用于列出仓库中的所有标识列。 以下示例列出了所有在定义中包含 IDENTITY 列的表,及其各自的架构名称,以及该表的 IDENTITY 列名称。

SELECT
    s.name AS SchemaName,
    t.name AS TableName,
    c.name AS IdentityColumnName
FROM
    sys.identity_columns AS ic
INNER JOIN
    sys.columns AS c ON ic.[object_id] = c.[object_id]
    AND ic.column_id = c.column_id
INNER JOIN
    sys.tables AS t ON ic.[object_id] = t.[object_id]
INNER JOIN
    sys.schemas AS s ON t.[schema_id] = s.[schema_id]
ORDER BY
    s.name, t.name;

局限性

  • Fabric 数据仓库中的列仅支持 IDENTITY 数据类型。 尝试使用其他数据类型会导致错误。
  • IDENTITY_INSERT Fabric 数据仓库不支持。 用户无法更新或手动在 Fabric 数据仓库中的标识列上插入列值。
  • 定义 seedincrement 不受支持。 因此,不支持重新插入 IDENTITY 列。
  • 不支持向现有表IDENTITY添加新ALTER TABLE列。 请考虑使用 CREATE TABLE AS SELECT(CTAS)SELECT...INTO 来创建现有表的副本,并在副本中添加新的 IDENTITY 列。
  • 创建新表时从具有IDENTITYCREATE TABLE AS SELECT (CTAS)的不同表中进行选择以保留SELECT... INTO列时适用一些限制。 有关详细信息,请参阅 SELECT - INTO 子句的“数据类型”部分(Transact-SQL)。

例子

答: 使用 IDENTITY 列创建表

CREATE TABLE Employees (
    EmployeeID BIGINT IDENTITY,
    FirstName VARCHAR(50),
    LastName VARCHAR(50)
);

此语句创建 Employees 表,其中每个新行自动接收一个唯一的 EmployeeID 作为 bigint 值。

B. 在具有标识列的表中插入

当第一列是IDENTITY列时,无需在列列表中指定它。

INSERT INTO Employees (FirstName, LastName) VALUES ('Ensi','Vasala')

如果为目标表的所有列(标识列除外)提供值,则也可以输出列名。

INSERT INTO Employees VALUES ('Quarantino', 'Esposito')

C. 使用 CREATE TABLE AS SELECT 创建具有 IDENTITY 列的新表(CTAS)

以简单表为例:

CREATE TABLE Employees (
    EmployeeID BIGINT IDENTITY,
    FirstName VARCHAR(50),
    LastName VARCHAR(50)
);

我们可以使用 CREATE TABLE AS SELECT (CTAS) 创建此表的副本,并将 IDENTITY 属性保存在目标表中:

CREATE TABLE RetiredEmployees
AS SELECT * FROM Employees

目标表上的列继 IDENTITY 承源表的属性。 有关适用于此场景的限制列表,请参阅 SELECT - INTO 条款中的数据类型部分

D. 使用 SELECT... INTO 语句创建包含 IDENTITY 列的新表

以简单表为例:

CREATE TABLE dbo.Employees (
    EmployeeID BIGINT IDENTITY,
    FirstName VARCHAR(50),
    LastName VARCHAR(50),
    Retired BIT
);

我们可用于 SELECT... INTO 创建此表的副本,将属性保存在 IDENTITY 目标表中:

SELECT *
INTO dbo.RetiredEmployees
FROM dbo.Employees
WHERE Retired = 1;

目标表上的列继 IDENTITY 承源表的属性。 有关适用于此场景的限制列表,请参阅 SELECT - INTO 条款中的数据类型部分