Fabric Data WarehouseでIDENTITY列を使いましょう

適用対象:✅Microsoft Fabric の倉庫

このチュートリアルでは、Fabric Data WarehouseでIDENTITY列を使って代理キーを作成・管理する方法を説明します。 識別列付きのテーブルの作成方法、データ挿入、 IDENTITY_INSERTで明示的な値を挿入する方法、 DBCC CHECKIDENTで識別子の範囲を再シードする方法を学びます。

[前提条件]

  • Contributor以上の権限を持つワークスペース内の倉庫アイテムへのアクセス。
  • クエリツールです。 このチュートリアルはMicrosoft FabricポータルのSQLクエリエディタを使っていますが、どのT-SQLクエリツールでも使えます。
  • T-SQLの基本的な理解。

IDENTITY 列とは何ですか?

IDENTITY列は、新しい行の一意の値を自動的に生成する数値列です。 この動作により、各行に一意の識別子が割り当てられるため、代理キーの実装に理想的です。

IDENTITY 列を作成する

IDENTITY列を定義するには、CREATE TABLE T-SQL構文の列定義で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を使ってテーブルにデータを取り込みます。 IDENTITY列でCOPY INTOを使う場合は、列リストを提供し、それをソースデータの列にマッピングします。

     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 行を含むテーブルを示すクエリ結果のスクリーンショット。

    Important

    あなたの価値観はこの記事の価値観と異なるかもしれません。 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';    
    

    新しい行に割り当てられている値を確認します。

    タクシー旅行データを示す2行6列のテーブルのスクリーンショット。

明示的な値を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 の場合、ID 列を含む列リストを指定します:

    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;