在Fabric Data Warehouse中使用身份欄位

適用於:Microsoft Fabric 中的✅ 資料庫

本教學說明如何在 Fabric Data Warehouse 中使用 IDENTITY 欄位來建立和管理代理金鑰。 你會學習如何建立帶有身份欄位的資料表、插入資料、用 IDENTITY_INSERT插入明確值,以及用 重新種回身份範圍 DBCC CHECKIDENT

先決條件

什麼是身份專欄?

IDENTITY欄位是一種數字欄位,會自動產生新列的唯一值。 這種行為使其成為實作代理金鑰的理想選擇,因為每列都能獲得唯一識別碼,無需手動輸入。

建立 IDENTITY 欄位

要定義欄位IDENTITY,請在 T-SQL 語法的欄位定義CREATE TABLE中指定IDENTITY關鍵字:

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

建立一個帶有 IDENTITY 欄位的資料表

在這個教學中,你會從 NY Taxi 開放資料集建立一個更簡單的表格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;