SKAPA TABELL (Transact-SQL) IDENTITET (egenskap)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsLager i Microsoft FabricSQL-databas i Microsoft Fabric

Skapar en identitetskolumn i en tabell. Denna egenskap används med CREATE TABLE och ALTER TABLE Transact-SQL-satserna.

Note

Egenskapen IDENTITY skiljer sig från egenskapen SQL-DMO Identity som exponerar radidentitetsegenskapen för en kolumn.

Transact-SQL syntaxkonventioner

Syntax

Syntax för Fabric Data Warehouse:

IDENTITY 
IDENTITY [ (seed , increment) ]

Arguments

seed

Det värde som används för den allra första raden som läses in i tabellen.

increment

Det inkrementella värde som läggs till i identitetsvärdet för föregående rad som lästes in.

Du måste ange både fröet och öka eller ingetdera. Om inget av dem anges är standardvärdet (1,1).

Remarks

Identitetskolumner kan användas för att generera nyckelvärden.

Identitetsegenskapen i en kolumn garanterar följande villkor:

  • Varje nytt värde genereras baserat på aktuellt startvärde och inkrement.

  • Varje nytt värde för en viss transaktion skiljer sig från andra samtidiga transaktioner i tabellen.

Identitetsegenskapen i en kolumn garanterar inte följande villkor:

  • Värdets unikhet – Unikhet måste framtvingas med hjälp av en begränsning eller PRIMARY KEYUNIQUE ett UNIQUE index.

  • Efterföljande värden inom en transaktion – En transaktion som infogar flera rader garanteras inte att få efterföljande värden för raderna eftersom andra samtidiga infogningar kan förekomma i tabellen. Om värdena måste vara på varandra följande bör transaktionen använda ett exklusivt lås i tabellen eller använda SERIALIZABLE isoleringsnivån.

  • Efterföljande värden efter omstart av servern eller andra fel – SQL Server kan cachelagra identitetsvärden av prestandaskäl och vissa av de tilldelade värdena kan gå förlorade vid ett databasfel eller vid omstart av servern. Detta kan resultera i luckor i identitetsvärdet vid infogning. Om luckor inte är acceptabla bör programmet använda sin egen mekanism för att generera nyckelvärden. Om du använder en sekvensgenerator med NOCACHE alternativet kan du begränsa luckor till transaktioner som aldrig har checkats in.

  • Återanvändning av värden – För en viss identitetsegenskap med specifik seed/increment återanvänds inte identitetsvärdena av motorn. Om en viss insert-instruktion misslyckas eller om insert-instruktionen återställs går de förbrukade identitetsvärdena förlorade och genereras inte igen. Detta kan leda till luckor när efterföljande identitetsvärden genereras.

Dessa begränsningar är en del av designen för att förbättra prestanda och eftersom de är acceptabla i många vanliga situationer. Om du inte kan använda identitetsvärden på grund av dessa begränsningar skapar du en separat tabell med ett aktuellt värde och hanterar åtkomst till tabell- och nummertilldelningen med ditt program.

Om en tabell med en identitetskolumn publiceras för replikering måste identitetskolumnen hanteras på ett sätt som är lämpligt för den typ av replikering som används. Mer information finns i Replikera identitetskolumner.

I minnesoptimerade tabeller måste startvärdet och inkrementet anges till 1, 1. Om du anger startvärdet eller inkrementet till ett annat värde än 1 resulterar det i följande fel: The use of seed and increment values other than 1 is not supported with memory optimized tables.

Endast en identitetskolumn kan skapas per tabell.

När identitetsegenskapen har angetts för en kolumn kan den inte tas bort. Datatypen kan ändras så länge den nya datatypen är kompatibel med identitetsegenskapen.

I Fabric Data Warehouse kan du inte ange seed eller increment, eftersom dessa värden automatiskt hanteras för att tillhandahålla unika heltal. BIGINT IDENTITY är allt som krävs för en kolumndefinition i ett CREATE TABLE uttalande. För mer information, se IDENTITY i Fabric Data Warehouse.

Du kan migrera tabeller till Fabric Data Warehouse med surrogatnyckelkolumner efter att ha anpassat dig till skillnaderna i implementeringen IDENTITY i Fabric Data Warehouse.

Azure Synapse Analytics stöder PRIMARY KEY inte begränsningar eller UNIQUEUNIQUE index. Mer information finns i Använda IDENTITY för att skapa surrogatnycklar i en Synapse SQL-pool. - I dedikerade SQL-pooler i Azure Synapse Analytics är identitetsvärdena inte inkrementella på grund av datalagrets distribuerade arkitektur. Mer information finns i Använda IDENTITY för att skapa surrogatnycklar i en Synapse SQL-pool. - IDENTITY stöds inte av serverlösa SQL-pooler i Azure Synapse Analytics.

Examples

A. Använda identitetsegenskapen med CREATE TABLE

I följande exempel skapas en ny tabell med egenskapen IDENTITY för ett automatiskt inkrementellt identifieringsnummer.

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. Använd allmän syntax för att hitta luckor i identitetsvärden

I följande exempel visas allmän syntax för att hitta luckor i identitetsvärden när data tas bort.

Note

Den första delen av följande Transact-SQL skript är endast avsedd för illustration. Du kan köra Transact-SQL skriptet som börjar med kommentaren: -- 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. Skapa en tabell med en IDENTITY-kolumn i Fabric Data Warehouse

Gäller för: Infrastrukturdatalager

CREATE TABLE dbo.Employees (
    EmployeeID BIGINT IDENTITY,
    FirstName VARCHAR(50),
    LastName VARCHAR(50),
    Retired BIT
);

Denna sats skapar tabellen dbo.Employees där varje ny rad automatiskt får ett unikt EmployeeID som bigintvärde . För mer information, se IDENTITY i Fabric Data Warehouse.

Vi kan använda dem SELECT... INTO för att skapa en kopia av denna tabell, och behålla egenskapen IDENTITY i måltabellen:

SELECT *
INTO dbo.RetiredEmployees
FROM dbo.Employees
WHERE Retired = 1;

Kolumnen i måltabellen ärver egenskapen IDENTITY från källtabellen. För en lista över begränsningar som gäller för detta scenario, se avsnittet Data Types i SELECT - INTO Clause.