共用方式為


CREATE TABLE (Transact-SQL) IDENTITY (屬性)

適用於:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsMicrosoft Fabric 中的倉庫Microsoft Fabric 中的 SQL 資料庫

建立資料表中的識別欄位。 此性質用於 和 CREATE TABLE Transact-SQL ALTER TABLE 語句。

Note

IDENTITY 屬性與公開數據行之數據列識別屬性的 SQL-DMO Identity 屬性不同。

Transact-SQL 語法慣例

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 KEYUNIQUE 條件約束或 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 條款中的資料型別章節