適用於:Microsoft Fabric 中的✅ 資料庫
本教學說明如何在 Fabric Data Warehouse 中使用 IDENTITY 欄位來建立和管理代理金鑰。 你會學習如何建立帶有身份欄位的資料表、插入資料、用 IDENTITY_INSERT插入明確值,以及用 重新種回身份範圍 DBCC CHECKIDENT。
先決條件
- 在工作區中以貢獻者或更高權限存取倉庫項目。
- 查詢工具。 這個教學使用了 Microsoft Fabric 入口網站的 SQL 查詢編輯器,但你也可以使用任何 T-SQL 查詢工具。
- 對 T-SQL 有基本的理解。
什麼是身份專欄?
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 值。
定義一個具有
IDENTITY欄位的表格:CREATE TABLE dbo.Trip ( TripID bigint IDENTITY, tpepPickupDateTime datetime2(6), tpepDropoffDateTime datetime2(6), passengerCount int, tripDistance float, fareAmount float, totalAmount float );用
COPY INTO來將資料匯入資料表。 當您將COPY INTO與IDENTITY欄位搭配使用時,請提供欄位清單,並將其對應到來源資料中的欄位。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');預覽資料及欄位
IDENTITY分配的值:SELECT TOP 10 * FROM Trip;輸出包含每一列自動產生的
TripID值。這很重要
你的價值觀可能與本文所描述的不同。
IDENTITY欄位產生的值保證是唯一,但這些值不一定是連續或有序的,且可能出現空檔。用
INSERT INTO來輸入新資料列:INSERT INTO dbo.Trip VALUES ('2026-01-01T00:00:00', '2013-01-01T00:12:00', 1, 2.4, 10.5, 13.0);欄位清單可搭配
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);檢視插入的行:
SELECT * FROM dbo.Trip WHERE CAST(tpepPickupDateTime AS date) = '2026-01-01';觀察新列所分配的值:
以 IDENTITY_INSERT 插入明確的數值
你可能需要在資料遷移、填充哨兵值或從備份還原資料時,插入特定值到身份欄位。 使用 SET IDENTITY_INSERT 來啟用這些插入。
在本節中,你會建立一個維度表,並用 IDENTITY_INSERT 來加入具有已知鍵值的哨兵列。
建立一個包含
IDENTITY欄位的維度表:CREATE TABLE dbo.DimCustomer ( CustomerKey BIGINT IDENTITY, CustomerName VARCHAR(100), CustomerType VARCHAR(20) );插入一般列。 識別值會自動產生:
INSERT INTO dbo.DimCustomer (CustomerName, CustomerType) VALUES ('Contoso Ltd', 'Enterprise'), ('Fabrikam Inc', 'SMB'), ('Northwind Traders', 'Enterprise');啟用
IDENTITY_INSERT可新增哨兵數值。 當IDENTITY_INSERT為ON時,提供包含識別欄位的欄位清單: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;插入明確指定的值後,請將識別欄位的種子值重新設為
DBCC CHECKIDENT,以確保未來自動產生的值不會與已插入的值發生衝突:DBCC CHECKIDENT('dbo.DimCustomer', RESEED);確認哨兵列是否與自動產生的列並列出現:
SELECT * FROM dbo.DimCustomer ORDER BY CustomerKey;插入一列並確認自動產生的值沒有衝突:
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;