När du använder T-SQL för att skapa (eller ändra) en tabell i SQL Server, har du möjlighet att använda IDENTITY()
egenskap för att skapa en identitetskolumn.
En identitetskolumn innehåller ett automatiskt ökande identifikationsnummer. IDENTITY()
egenskapen kan användas med CREATE TABLE
och ALTER TABLE
uttalanden.
Syntax
Syntaxen ser ut så här:
IDENTITY [ (seed , increment) ]
fröet är värdet som används för den allra första raden som laddas in i tabellen.
ökningen är det inkrementella värdet som läggs till identitetsvärdet för den föregående raden som laddades.
Du måste ange båda argumenten eller ingetdera. Om du inte anger någotdera är standardvärdet (1,1)
.
Exempel 1 – Grundläggande användning
Här är ett exempel att visa.
CREATE TABLE Pets ( PetId int IDENTITY(1,1) PRIMARY KEY, PetName varchar(255) );
Denna kod skapar en tabell med två kolumner. Den första kolumnen (PetId
) är en identitetskolumn eftersom jag använder IDENTITY()
egendom i dess definition.
Nu när jag har skapat en identitetskolumn kan jag infoga husdjursnamn i PetName
kolumn utan att behöva inkludera ett ID för varje rad.
INSERT INTO Pets (PetName) VALUES ('Homer'), ('Felix'), ('Ruff'); SELECT * FROM Pet;
Resultat:
+---------+-----------+ | PetId | PetName | |---------+-----------| | 1 | Homer | | 2 | Felix | | 3 | Ruff | +---------+-----------+
Exempel 2 – Olika frö och ökning
Här är ett exempel som använder ett annat frö och inkrement.
I det här fallet börjar fröet med 150 och ökar med 10 för varje rad.
CREATE TABLE Cities ( CityId int IDENTITY(150, 10) PRIMARY KEY, CityName varchar(255) );
Infoga nu lite data och välj det:
INSERT INTO Cities (CityName) VALUES ('Auckland'), ('Danang'), ('Khon Kaen'); SELECT * FROM Cities;
Resultat:
+----------+------------+ | CityId | CityName | |----------+------------| | 150 | Auckland | | 160 | Danang | | 170 | Khon Kaen | +----------+------------+
Exempel 3 – Felaktig användning
Som nämnts måste du ange båda argumenten eller ingetdera. Med andra ord, du kan inte bara ge ett argument. Här är ett exempel på vad som händer när du bara ger ett argument.
CREATE TABLE Cities ( CityId int IDENTITY(1) PRIMARY KEY, CityName varchar(255) );
Resultat:
Msg 102, Level 15, State 1, Line 2 Incorrect syntax near ')'.
Exempel 4 – Att försöka åsidosätta identitetsvärdena
Om du försöker åsidosätta de automatiska identitetsvärdena kan du få ett felmeddelande som detta.
INSERT INTO Cities (CityId, CityName) VALUES (123, 'Bangkok');
Resultat:
Msg 544, Level 16, State 1, Line 1 Cannot insert explicit value for identity column in table 'Cities' when IDENTITY_INSERT is set to OFF.
Detta beror på att du försöker åsidosätta värdena som skapats av IDENTITY()
fast egendom. I många fall kan det vara så att du helt enkelt inte visste att det var en identitetskolumn. I sådana fall är allt du behöver göra att ta bort identitetskolumnen från din INSERT
uttalande.
Men om du verkligen gör måste åsidosätta IDENTITY()
egenskap, se Hur man infogar värden i en IDENTITY-kolumn i SQL Server.
Som nämnts, om du inte behöver åsidosätta identitetsvärdena kan du helt enkelt ta bort den kolumnen från din INSERT
påstående.
Så jag kan ändra det tidigare uttalandet till detta:
INSERT INTO Cities (CityName) VALUES ('Bangkok'); SELECT * FROM Cities;
Resultat:
+----------+------------+ | CityId | CityName | |----------+------------| | 150 | Auckland | | 160 | Danang | | 170 | Khon Kaen | | 180 | Bangkok | +----------+------------+
Begränsningar för IDENTITY()-egendomen
Identitetsegenskapen på en kolumn garanterar följande:
- Varje nytt värde genereras baserat på aktuellt frö och inkrement.
- Varje nytt värde för en viss transaktion skiljer sig från andra samtidiga transaktioner på bordet.
Det garanterar inte följande:
- Värdets unika karaktär
- Konsekutiva värden inom en transaktion
- Konsekutiva värden efter omstart av servern eller andra fel
- Återanvändning av värden (till exempel när en
INSERT
operation misslyckas)
Mer information om dessa begränsningar finns i Microsofts dokumentation.