適用対象:✅Microsoft Fabric の倉庫
本記事では、SQL Server、Azure SQL Database、またはAzure Synapse Analyticsからの移行時に既存の識別値を保持し、参照の整合性を確保するために、SET IDENTITY_INSERTおよびDBCC CHECKIDENTの使い方について説明します。
他のプラットフォームとの主な違い
移行前に、Fabric Data WarehouseのIDENTITY実装における以下の違いを理解してください。
-
IDENTITYカラムは BIINT データ型のみをサポートします。 -
SEEDそしてINCREMENTパラメータはサポートされていません。 システムは内部で価値を管理しています。 - 値は一意であることが保証されますが、必ずしも連続的ではありません。 分散型計算アーキテクチャのためにギャップが生じることがあります。
- Fabric Data Warehouse では、キー制約は適用されません。
移行戦略
IDENTITY_INSERTサポートを利用することで、識別子の値をIDENTITYカラムを使用するFabric Data Warehouseテーブルに直接移行できます:
- Fabric Data Warehouse で
IDENTITY列を含む宛先テーブルを作成する。 -
SET IDENTITY_INSERT ONを使って、元の識別値を保持した履歴データを挿入します。 - 移行後に
RESEEDでDBCC CHECKIDENTを実行して識別範囲を再調整してください。 - 必要に応じて外部キー参照を更新してください。
このアプローチは元の識別値を維持し、テーブル間での参照整合性を維持し、移行後に一意値を生成Fabric Data Warehouse再開できるようにします。
例:IDENTITY列を持つテーブルの移行
以下の例は、識別値を保持しつつ、OrdersテーブルをソースプラットフォームからFabric Data Warehouseへ移行します。
ステップ1:IDENTITY列を持つ宛先テーブルを作成する
Fabric Data Warehouseで宛先テーブルを作成します。 主キー列は IDENTITYを使用します:
CREATE TABLE dbo.Orders (
OrderID BIGINT IDENTITY,
OrderDate DATE,
CustomerID BIGINT,
TotalAmount DECIMAL(18, 2)
);
ステップ2:IDENTITY_INSERTでデータを移行する
SET IDENTITY_INSERTを使って元の識別値を持つ過去のデータを入力します。 この方法は既存のIDを保持するため、テーブル間の関係が維持されます。
-- Migrate Orders with original IDs
SET IDENTITY_INSERT dbo.Orders ON;
INSERT INTO dbo.Orders (OrderID, OrderDate, CustomerID, TotalAmount)
VALUES (101, '2025-01-15', 1, 5000.00),
(102, '2025-02-20', 2, 3200.00),
(103, '2025-03-10', 1, 7800.00),
(104, '2025-04-05', 3, 1500.00);
SET IDENTITY_INSERT dbo.Orders OFF;
より大きなデータセットの場合は、 COPY INTO と IDENTITY_INSERTを組み合わせて利用できます:
COPY INTO dbo.Orders (OrderID 1, OrderDate 2, CustomerID 3, TotalAmount 4)
FROM 'https://storage.blob.core.windows.net/migration/orders.csv'
WITH (
FILE_TYPE = 'CSV',
IDENTITY_INSERT = 'ON'
);
ステップ3:アイデンティティカラムの再シード
データを移行した後、各テーブルにRESEEDを置いてDBCC CHECKIDENTを実行します。 この操作は、使用されたすべての識別子範囲をスキャンし、次の値を調整して移行データとの衝突を避けます。
DBCC CHECKIDENT('dbo.Orders', RESEED);
ステップ4:移行を確認し、新しいインサートをテストする
移行されたデータが無傷であること、そして新しい挿入物が移行した値と重複しない自動生成値を受信しているか確認してください:
-- Verify migrated data
SELECT * FROM dbo.Orders ORDER BY OrderID;
-- Insert a row that receives an automatically generated ID
INSERT INTO dbo.Orders (OrderDate, CustomerID, TotalAmount)
VALUES ('2025-05-01', 1, 2500.00);
-- Verify that new IDs don't overlap with migrated data
SELECT * FROM dbo.Orders ORDER BY OrderID;
ベスト プラクティス
- 渡りの後は必ず再種をまきましょう。 各テーブルの移行後に
DBCC CHECKIDENT('table_name', RESEED)を実行し、アイデンティティ値の衝突を防ぎます。 - 大規模なデータセットにはCOPY INTOを使ってください。 大きなテーブルの一括移行においては、
IDENTITY_INSERT ONCOPY INTOが行ごとのINSERT文よりも優れたパフォーマンスを提供します。 - 参照の完全性を検証する。 移行後、子テーブルの外部キー値が親テーブルの有効な行を参照しているか確認してください。