Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
SQL-databas i Förhandsversion av Microsoft Fabric
Skapar en identitetskolumn i en tabell. Den här egenskapen används med satserna CREATE TABLE och ALTER TABLE Transact-SQL.
Note
Egenskapen IDENTITY skiljer sig från egenskapen SQL-DMO Identity som exponerar radidentitetsegenskapen för en kolumn.
Transact-SQL syntaxkonventioner
Syntax
IDENTITY [ (seed , increment) ]
Den här syntaxen stöds inte av en serverlös SQL-pool i Azure Synapse Analytics.
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.
Note
I Azure Synapse Analytics är värden för identitet inte inkrementella på grund av den distribuerade arkitekturen i informationslagret. Mer information finns i Använda IDENTITY för att skapa surrogatnycklar i en Synapse SQL-pool.
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
UNIQUEUNIQUEettPRIMARY KEYindex.Note
Azure Synapse Analytics stöder
PRIMARY KEYinte begränsningar ellerUNIQUEUNIQUEindex. Mer information finns i Använda IDENTITY för att skapa surrogatnycklar i en Synapse SQL-pool.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
SERIALIZABLEisoleringsnivå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
NOCACHEalternativet 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.
Endast en identitetskolumn kan skapas per tabell.
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.
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.
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;