sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man använder egenskapen IDENTITY() i SQL Server

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.


  1. Jämför två rader och identifiera kolumner vars värden är olika

  2. Vad är skillnaden mellan kommaseparerade joins och join on syntax i MySQL?

  3. Visa alla frågor som kommer till en Oracle-databas

  4. MySql uppdaterar två tabeller samtidigt