適用於:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Microsoft Fabric
中的倉庫Microsoft Fabric 中的 SQL 資料庫
建立資料表中的識別欄位。 此性質用於 和 CREATE TABLE Transact-SQL ALTER TABLE 語句。
Note
IDENTITY 屬性與公開數據行之數據列識別屬性的 SQL-DMO Identity 屬性不同。
Syntax
Fabric 資料倉儲的語法:
IDENTITY
IDENTITY [ (seed , increment) ]
Arguments
seed
用於載入資料表中第一個數據列的值。
increment
加入至已載入上一個數據列之識別值的累加值。
您必須同時指定種子和遞增,或同時不指定這兩者。 如果同時不指定這兩者,預設值便是 (1,1)。
Remarks
識別欄位可用於產生索引鍵值。
資料行上的 identity 屬性保證下列條件:
每個新值都會根據目前的種子和增量產生。
特定交易的每個新值都與資料表上的其他並行交易不同。
資料行上的識別屬性不保證下列條件:
值的唯一性 - 唯一性必須使用 或 條件約束或
PRIMARY KEYUNIQUE索引來強制執行唯一UNIQUE性。交易 中的連續值 - 插入多個數據列的交易不保證會取得數據列的連續值,因為數據表上可能會發生其他並行插入。 如果值必須連續,則交易應該在數據表上使用獨佔鎖定或使用
SERIALIZABLE隔離等級。重新啟動伺服器或其他失敗之後的連續值 - SQL Server 可能會基於效能考量而快取識別值,因此在資料庫失敗或伺服器重新啟動期間,某些指派的值可能會遺失。 這可能會導致插入識別值之後的間隙。 如果無法接受差距,則應用程式應該使用自己的機制來產生索引鍵值。 使用具有 選項的
NOCACHE序列產生器,可以將間距限制為永遠不會認可的交易。重複使用值 - 對於具有特定種子/增量的指定識別屬性,引擎不會重複使用識別值。 如果特定的 insert 語句失敗,或如果 insert 語句回復,則會遺失已取用的識別值,且不會再次產生。 這樣在產生後續識別值時會產生間隙。
這些限制是設計中改善效能的一部分,而且在許多常見情況下都是可接受的。 如果您因為這些限制而無法使用身分識別值,請建立一個保存目前值的個別數據表,並管理對您應用程式的數據表和數位指派的存取權。
如果發行含識別欄位的資料表來進行複寫,您必須依照使用的複寫類型所適用的方式,來管理識別欄位。 如需詳細資訊,請參閱複寫識別資料欄。
在記憶體優化資料表中,種子和增量必須設定為 1, 1。 將種子或遞增設定為以外的 1 值,會產生下列錯誤: The use of seed and increment values other than 1 is not supported with memory optimized tables。
每份資料表都只能建立一個識別欄位。
在數據行上設定身分識別屬性之後,就無法移除該屬性。 只要新的數據類型與identity屬性相容,就可以變更數據類型。
在 Fabric Data Warehouse 中,你無法指定 seed or increment,因為這些值會自動管理以提供唯一的整數。
BIGINT IDENTITY 是陳述句中欄位定義 CREATE TABLE 所需的全部條件。 欲了解更多資訊,請參閱 Fabric 資料倉儲中的 IDENTITY。
在適應 IDENTITY Fabric Data Warehouse 實作的不同後,你可以用代理鍵欄位將資料表遷移到 Fabric Data Warehouse。
Azure Synapse Analytics 不支援 PRIMARY KEY 或 UNIQUE 條件約束或 UNIQUE 索引。 如需詳細資訊,請參閱 在 Synapse SQL 集區中使用 IDENTITY 建立代理密鑰。
- 在 Azure Synapse Analytics 的專用 SQL 池中,由於資料倉儲採用分散式架構,身份值並非增量。 如需詳細資訊,請參閱 在 Synapse SQL 集區中使用 IDENTITY 建立代理密鑰。
-
IDENTITY Azure Synapse Analytics 中的無伺服器 SQL 池不支援。
Examples
A. 搭配 CREATE TABLE 使用 IDENTITY 屬性
下列範例會利用自動累加的識別碼之 IDENTITY 屬性,來建立一份新的資料表。
USE AdventureWorks2022;
GO
IF OBJECT_ID('dbo.new_employees', 'U') IS NOT NULL
DROP TABLE new_employees;
GO
CREATE TABLE new_employees (
id_num INT IDENTITY(1, 1),
fname VARCHAR(20),
minit CHAR(1),
lname VARCHAR(30)
);
INSERT new_employees (fname, minit, lname)
VALUES ('Karin', 'F', 'Josephs');
INSERT new_employees (fname, minit, lname)
VALUES ('Pirkko', 'O', 'Koskitalo');
B. 使用泛型語法來尋找識別值中的間距
下列範例會顯示在移除資料時,用來尋找識別值間距的一般語法。
Note
下列 Transact-SQL 指令碼的第一部份僅供解說之用。 您可以執行開頭是下列註解的 Transact-SQL 指令碼:-- Create the img table。
-- Here is the generic syntax for finding identity value gaps in data.
-- The illustrative example starts here.
SET IDENTITY_INSERT tablename ON;
DECLARE @minidentval column_type;
DECLARE @maxidentval column_type;
DECLARE @nextidentval column_type;
SELECT @minidentval = MIN($IDENTITY),
@maxidentval = MAX($IDENTITY)
FROM tablename
IF @minidentval = IDENT_SEED('tablename')
SELECT @nextidentval = MIN($IDENTITY) + IDENT_INCR('tablename')
FROM tablename t1
WHERE $IDENTITY BETWEEN IDENT_SEED('tablename')
AND @maxidentval
AND NOT EXISTS (
SELECT *
FROM tablename t2
WHERE t2.$IDENTITY = t1.$IDENTITY + IDENT_INCR('tablename')
)
ELSE
SELECT @nextidentval = IDENT_SEED('tablename');
SET IDENTITY_INSERT tablename OFF;
-- Here is an example to find gaps in the actual data.
-- The table is called img and has two columns: the first column
-- called id_num, which is an increasing identification number, and the
-- second column called company_name.
-- This is the end of the illustration example.
-- Create the img table.
-- If the img table already exists, drop it.
-- Create the img table.
IF OBJECT_ID('dbo.img', 'U') IS NOT NULL
DROP TABLE img;
GO
CREATE TABLE img (
id_num INT IDENTITY(1, 1),
company_name SYSNAME
);
INSERT img (company_name)
VALUES ('New Moon Books');
INSERT img (company_name)
VALUES ('Lucerne Publishing');
-- SET IDENTITY_INSERT ON and use in img table.
SET IDENTITY_INSERT img ON;
DECLARE @minidentval SMALLINT;
DECLARE @nextidentval SMALLINT;
SELECT @minidentval = MIN($IDENTITY)
FROM img
IF @minidentval = IDENT_SEED('img')
SELECT @nextidentval = MIN($IDENTITY) + IDENT_INCR('img')
FROM img t1
WHERE $IDENTITY BETWEEN IDENT_SEED('img')
AND 32766
AND NOT EXISTS (
SELECT *
FROM img t2
WHERE t2.$IDENTITY = t1.$IDENTITY + IDENT_INCR('img')
)
ELSE
SELECT @nextidentval = IDENT_SEED('img');
SET IDENTITY_INSERT img OFF;
A. 在 Fabric Data Warehouse 建立一個帶有 IDENTITY 欄位的資料表
適用於: Fabric 資料倉儲
CREATE TABLE dbo.Employees (
EmployeeID BIGINT IDENTITY,
FirstName VARCHAR(50),
LastName VARCHAR(50),
Retired BIT
);
此陳述句建立 dbo.Employees 的表格是每新增一列自動獲得唯一 EmployeeID 值作為 bigint 值。 欲了解更多資訊,請參閱 Fabric 資料倉儲中的 IDENTITY。
我們可以用 Then SELECT... INTO 來建立這個資料表的複製品,並將該屬性持久化 IDENTITY 在目標資料表中:
SELECT *
INTO dbo.RetiredEmployees
FROM dbo.Employees
WHERE Retired = 1;
目標資料表上的欄位繼承了來源資料表的 IDENTITY 屬性。 關於適用於此情境的限制清單,請參閱 SELECT - INTO 條款中的資料型別章節。