sql >> Database >  >> RDS >> Sqlserver

De eigenschap IDENTITY() gebruiken in SQL Server

Wanneer u T-SQL gebruikt om een ​​tabel in SQL Server aan te maken (of te wijzigen), heeft u de mogelijkheid om de IDENTITY() te gebruiken eigenschap om een ​​identiteitskolom te maken.

Een identiteitskolom bevat een automatisch oplopend identificatienummer. De IDENTITY() eigenschap kan worden gebruikt met de CREATE TABLE en ALTER TABLE verklaringen.

Syntaxis

De syntaxis gaat als volgt:

IDENTITY [ (seed , increment) ]

Het zaad is de waarde die wordt gebruikt voor de allereerste rij die in de tabel wordt geladen.

De verhoging is de incrementele waarde die wordt toegevoegd aan de identiteitswaarde van de vorige rij die werd geladen.

U moet beide argumenten opgeven of geen van beide. Als u geen van beide opgeeft, is de standaard (1,1) .

Voorbeeld 1 – Basisgebruik

Hier is een voorbeeld om te demonstreren.

CREATE TABLE Pets (
    PetId int IDENTITY(1,1) PRIMARY KEY, 
    PetName varchar(255)
    );

Deze code maakt een tabel met twee kolommen. De eerste kolom (PetId ) is een identiteitskolom omdat ik de IDENTITY() . gebruik eigenschap in zijn definitie.

Nu ik een identiteitskolom heb gemaakt, kan ik huisdiernamen invoegen in de PetName kolom zonder dat u voor elke rij een ID hoeft op te nemen.

INSERT INTO Pets (PetName)
VALUES ('Homer'), ('Felix'), ('Ruff');

SELECT * FROM Pet;

Resultaat:

+---------+-----------+
| PetId   | PetName   |
|---------+-----------|
| 1       | Homer     |
| 2       | Felix     |
| 3       | Ruff      |
+---------+-----------+

Voorbeeld 2 – Ander zaad en toename

Hier is een voorbeeld dat een andere seed en increment gebruikt.

In dit geval begint de seed bij 150 en wordt voor elke rij met 10 verhoogd.

CREATE TABLE Cities (
    CityId int IDENTITY(150, 10) PRIMARY KEY, 
    CityName varchar(255)
    );

Voer nu wat gegevens in en selecteer deze:

INSERT INTO Cities (CityName)
VALUES ('Auckland'), ('Danang'), ('Khon Kaen');

SELECT * FROM Cities;

Resultaat:

+----------+------------+
| CityId   | CityName   |
|----------+------------|
| 150      | Auckland   |
| 160      | Danang     |
| 170      | Khon Kaen  |
+----------+------------+

Voorbeeld 3 – Onjuist gebruik

Zoals vermeld, moet u beide argumenten opgeven of geen van beide. Met andere woorden, u kunt niet slechts één argument geven. Hier is een voorbeeld van wat er gebeurt als je maar één argument geeft.

CREATE TABLE Cities (
    CityId int IDENTITY(1) PRIMARY KEY, 
    CityName varchar(255)
    );

Resultaat:

Msg 102, Level 15, State 1, Line 2
Incorrect syntax near ')'.

Voorbeeld 4 – Proberen de identiteitswaarden te negeren

Als u de automatische identiteitswaarden probeert te negeren, krijgt u mogelijk een foutmelding als deze.

INSERT INTO Cities (CityId, CityName)
VALUES (123, 'Bangkok');

Resultaat:

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.

Dit komt omdat u probeert de waarden te overschrijven die zijn gemaakt door de IDENTITY() eigendom. In veel gevallen kan het zijn dat je gewoon niet wist dat het een identiteitskolom was. In dergelijke gevallen hoeft u alleen de identiteitskolom uit uw INSERT . te verwijderen verklaring.

Als u echter echt doe moet de IDENTITY() . overschrijven eigenschap, zie Waarden invoegen in een IDENTITEIT-kolom in SQL Server.

Zoals gezegd, als u de identiteitswaarden niet hoeft te overschrijven, kunt u die kolom eenvoudig verwijderen uit uw INSERT uitspraak.

Dus ik kan de vorige verklaring hieraan aanpassen:

INSERT INTO Cities (CityName)
VALUES ('Bangkok');

SELECT * FROM Cities;

Resultaat:

+----------+------------+
| CityId   | CityName   |
|----------+------------|
| 150      | Auckland   |
| 160      | Danang     |
| 170      | Khon Kaen  |
| 180      | Bangkok    |
+----------+------------+

Beperkingen van de eigenschap IDENTITY()

De identiteitseigenschap op een kolom garandeert het volgende:

  • Elke nieuwe waarde wordt gegenereerd op basis van de huidige seed &increment.
  • Elke nieuwe waarde voor een bepaalde transactie is anders dan andere gelijktijdige transacties op tafel.

Het garandeert niet het volgende:

  • Uniek van de waarde
  • Opeenvolgende waarden binnen een transactie
  • Opeenvolgende waarden na herstart van de server of andere fouten
  • Hergebruik van waarden (bijvoorbeeld wanneer een INSERT bewerking mislukt)

Zie de Microsoft-documentatie voor meer informatie over deze beperkingen.


  1. Voer MySQLDump uit zonder tabellen te vergrendelen

  2. Word lid van 3 tabellen in SQL

  3. Hoe moet ik --secure-file-priv in MySQL aanpakken?

  4. NULL-type casten bij het bijwerken van meerdere rijen