適用対象:✅Microsoft Fabric の倉庫
Fabric Data Warehouseでは、IDENTITY列は新しい行をテーブルに挿入すると自動的に新しい数値値を生成します。
サロゲート キーは、データ ウェアハウスで行を一意に区別するために使用される識別子であり、その自然なキーとは無関係です。 この記事では、 IDENTITYを用いて代理キーの作成と管理方法、明示的な値の挿入や再シードの方法について説明します。
IDENTITY 列を使用する理由
IDENTITY カラムは手動のキー割り当てを不要にし、エラーのリスクを減らし、データ取り込みを簡素化します。 システム管理の一意の値は、代理キーと主キーとして最適です。 手動方式と比べて、 IDENTITY 列は追加のクエリロジックなしで一意キーが自動生成されるため、より良いパフォーマンスを提供します。
IDENTITY列に必要なbigintデータ型は、最大9,223,372,036,854,775,807個の正の整数値を保存できます。 この範囲により、各行の IDENTITY 列にテーブルの寿命を通じて固有の値が付与されます。
代理キーを使用して他のデータベース プラットフォームからデータを移行する計画については、「 IDENTITY 列を Fabric Data Warehouse に移行する」を参照してください。
構文
Fabric Data WarehouseでIDENTITY列を定義するには、列定義のIDENTITYプロパティを使用します。
CREATE TABLE { warehouse_name.schema_name.table_name | schema_name.table_name | table_name } (
[ column_name ] BIGINT IDENTITY ,
[ ,...n ]
-- Other columns here
);
ID 列は、テーブル定義内の最初の列である必要はありません。
IDENTITY 列のしくみ
Fabric Data Warehouseでは、カスタムの開始値やインクリメントを指定することはできません。 システムは内部で価値を管理し、独自性を確保しています。
IDENTITY 列は常に正の整数値を生成します。 新しい各行は新しい値を受け取り、テーブルが存在する限り一意性が保証されます。 一度値を使ったら、 IDENTITY は同じ値を二度と使いません。
IDENTITY列が生成する値に隙間が生じることがあります。
値の割り当て
ウェアハウスエンジンの分散アーキテクチャのため、 IDENTITY プロパティは代理値の割り当て順序を保証するものではありません。 この特性は、負荷性能に影響を与えずに並列性を最大化するために、計算ノード間でスケールアウトします。 その結果、異なる摂取タスクの価値範囲は連続的でない場合もあります。
この動作を次の例に示します。
-- Create a table with an IDENTITY column
CREATE TABLE dbo.Table1(
Column1 BIGINT IDENTITY,
Column2 VARCHAR(30) NULL
)
-- Ingestion task A
INSERT INTO dbo.Table1
VALUES (NULL), (NULL), (NULL), (NULL);
-- Ingestion task B
INSERT INTO dbo.Table1
VALUES (NULL), (NULL), (NULL), (NULL);
-- Review the data
SELECT * FROM dbo.Table1;
サンプルの結果:
この例では、 Ingestion task A と Ingestion task B が独立したタスクとして順番に実行されます。 タスクは連続して実行されますが、最初の4行と最後の4行は dbo.Table1.Column1で異なる識別キーの範囲を持っています。 タスクAとタスクBに割り当てられた範囲の間にギャップが生じることもあります。
IDENTITYFabric Data WarehouseはIDENTITY列のすべての値が一意であることを保証します。ただし、IDENTITY_INSERTが使われない限り例外がありますが、取り込みタスクで生成される範囲に隙間が生じることがあります。
システムメタデータオブジェクト
以下のシステムメタデータオブジェクトは、Fabric Data Warehouseで識別値の設計や作業に有用です。
sys.identity_columnsシステムビューで識別列を一覧
sys.identity_columnsカタログビューを使って、倉庫内のすべてのアイデンティティカラムを一覧にしてください。 以下の例は、 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 Data Warehouseでは、sys.identity_columnsのseed_value列とincrement_value列はNULL返し、識別列が作成された後は更新されません。
last_value列はデフォルトでNULLを返しますが、テーブル上の最初の識別挿入操作の後は恒久的に-1に切り替わります。
値をIDENTITY_INSERTで挿入してください
デフォルトでは、 IDENTITY 列に値を挿入することはできません。 ただし、データ移行や災害復旧、センチネル値を入力する際(例えば次元表の「未知」 -1 など)に特定の値を挿入する必要がある場合があります。
SET IDENTITY_INSERTを使って、一時的に識別カラムへの明示的な挿入を許可します:
SET IDENTITY_INSERT dbo.DimCustomer ON;
INSERT INTO dbo.DimCustomer (CustomerKey, CustomerName, Email)
VALUES (-1, 'John Doe', 'john@contoso.com');
SET IDENTITY_INSERT dbo.DimCustomer OFF;
IDENTITY_INSERTがONするとき:
-
INSERT文には列リストが必要です。 - 1つのセッションで同時に
ONをIDENTITY_INSERTに設定できるテーブルは1つだけです。
Important
IDENTITY_INSERTをオフにした後、識別子値をDBCC CHECKIDENTで再シードします。
DBCC CHECKIDENT で識別子値を再シードします
IDENTITY_INSERTで明示的な値を挿入した後、DBCC CHECKIDENTを使って識別列を再シードします。
RESEED操作は、分散計算ノード間で使用済みおよび予約されているすべての識別子の範囲をスキャンし、正しい次の値を決定し、一意性を確保しキー衝突を防ぎます。
DBCC CHECKIDENT('dbo.DimProduct', RESEED);
Fabric Data Warehouseでは、DBCC CHECKIDENTはRESEEDオプションのみをサポートしています。 ウェアハウスは自動的に正しい次の数値範囲を決定し、カスタムの再シード値を指定することはできません。 詳細については、「DBCC CHECKIDENT」を参照してください。
制限事項
詳細については、IDENTITY列、IDENTITY(Transact-SQL)およびMicrosoft Fabricの倉庫内のテーブル作成を参照してください。
- Fabric Data Warehouse の列では
IDENTITYデータ型のみがサポートされています。 他のデータ型はエラーを生みます。 - シードやインクリメントの定義はサポートされていません。 システムは内部で価値を管理しています。
-
ALTER TABLEで既存のテーブルにIDENTITY列を追加するのはサポートされていません。 既存のテーブルのコピーを作成し、IDENTITY列を追加するには、CREATE TABLE AS SELECT (CTAS) または SELECT...INTO の使用を検討してください。 - CTASや
SELECT...INTOで他のテーブルから選択してテーブルを作成する場合、IDENTITY列の保存方法には制限があります。 詳細については、 SELECT - INTO Clause(Transact-SQL)のデータ型セクションをご覧ください。 -
DBCC CHECKIDENTRESEEDオプションのみをサポートしています。 カスタムの再シード値の指定やNORESEEDの使用はサポートされていません。 -
IDENTITY列は一意であることが保証される値を表示しますが、値が必ずしも連続的または順序付けられているわけではなく、隙間が生じることがあります。
例示
A。 IDENTITY 列を含むテーブルを作成する
CREATE TABLE Employees (
EmployeeID BIGINT IDENTITY,
FirstName VARCHAR(50),
LastName VARCHAR(50)
);
この文は、新しい行ごとに自動的に一意のEmployeeIDをbigint値として受け取るというEmployeesテーブルを作成します。
B: ID 列を持つテーブルに行を挿入する
各非同一列に対して定義された順序で値を提供する場合、列リストを指定する必要はありません。
INSERT INTO Employees VALUES ('Quarantino', 'Esposito');
ID 列を省略した列リストを指定することもできます:
INSERT INTO Employees (FirstName, LastName)
VALUES ('Ensi', 'Vasala');
C. 明示的な値をIDENTITY_INSERTで挿入してください
SET IDENTITY_INSERT dbo.Employees ON;
INSERT INTO dbo.Employees (EmployeeID, FirstName, LastName)
VALUES (100, 'Sentinel', 'Row');
SET IDENTITY_INSERT dbo.Employees OFF;
D: COPY INTO で明示的な値を挿入します
COPY INTO文は、コマンド内で明示的な値を取り込むIDENTITY_INSERTオプションをサポートします。
COPY INTO オプションは IDENTITY_INSERTのセッションレベル設定を上書きします。
COPY INTO dbo.Employees (EmployeeID 1, FirstName 2, LastName 3)
FROM 'https://myaccount.blob.core.windows.net/myblobcontainer/folder1/'
WITH (
FILE_TYPE = 'CSV',
IDENTITY_INSERT = 'ON'
);
E. 明示的な挿入後にテーブルを再シードする
DBCC CHECKIDENT('dbo.Employees', RESEED);
F. CREATE TABLE AS SELECT を使用してテーブルを作成する
CTASを使ってテーブルのコピーを作成し、 IDENTITY プロパティをターゲットテーブルに永続化します:
CREATE TABLE RetiredEmployees
AS SELECT * FROM Employees;
ターゲットテーブルの列はソーステーブルから IDENTITY プロパティを継承します。 制限事項については 、SELECT - INTO Clauseの「データ型」セクションを参照してください。
G. SELECT...INTO を使用したテーブルの作成
SELECT...INTOを使ってテーブルのコピーを作成し、IDENTITYプロパティをターゲットテーブルに永続化します:
SELECT *
INTO dbo.RetiredEmployees
FROM dbo.Employees
WHERE LastName = 'Esposito';
ターゲットテーブルの列はソーステーブルから IDENTITY プロパティを継承します。 制限事項については 、SELECT - INTO Clauseの「データ型」セクションを参照してください。