sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan bruges egenskaben IDENTITY() i SQL Server

Når du bruger T-SQL til at oprette (eller ændre) en tabel i SQL Server, har du mulighed for at bruge IDENTITY() egenskab for at oprette en identitetskolonne.

En identitetskolonne indeholder et automatisk stigende identifikationsnummer. IDENTITY() egenskaben kan bruges med CREATE TABLE og ALTER TABLE udsagn.

Syntaks

Syntaksen ser sådan ud:

IDENTITY [ (seed , increment) ]

frøet er den værdi, der bruges til den allerførste række indlæst i tabellen.

stigningen er den trinvise værdi, der føjes til identitetsværdien for den forrige række, der blev indlæst.

Du skal angive begge argumenter eller ingen af ​​dem. Hvis du ikke angiver nogen af ​​dem, er standarden (1,1) .

Eksempel 1 – Grundlæggende brug

Her er et eksempel til at demonstrere.

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

Denne kode opretter en tabel med to kolonner. Den første kolonne (PetId ) er en identitetskolonne, fordi jeg bruger IDENTITY() ejendom i sin definition.

Nu hvor jeg har oprettet en identitetskolonne, kan jeg indsætte kæledyrsnavne i PetName kolonne uden at skulle inkludere et ID for hver række.

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

SELECT * FROM Pet;

Resultat:

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

Eksempel 2 – Forskellige frø og tilvækst

Her er et eksempel, der bruger en anden frø og stigning.

I dette tilfælde starter frøet ved 150 og øges med 10 for hver række.

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

Indsæt nu nogle data og vælg det:

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

SELECT * FROM Cities;

Resultat:

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

Eksempel 3 – Forkert brug

Som nævnt skal du angive begge argumenter eller ingen af ​​dem. Du kan med andre ord ikke give kun ét argument. Her er et eksempel på, hvad der sker, når du kun giver ét 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 ')'.

Eksempel 4 – Forsøger at tilsidesætte identitetsværdierne

Hvis du forsøger at tilsidesætte de automatiske identitetsværdier, får du muligvis en fejl som denne.

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.

Dette skyldes, at du forsøger at tilsidesætte de værdier, der er oprettet af IDENTITY() ejendom. I mange tilfælde kan det være, at du bare ikke vidste, at det var en identitetsspalte. I sådanne tilfælde er alt hvad du skal gøre at fjerne identitetskolonnen fra din INSERT erklæring.

Men hvis du virkelig gør nødt til at tilsidesætte IDENTITY() egenskab, se Sådan indsætter du værdier i en IDENTITY-kolonne i SQL Server.

Som nævnt, hvis du ikke behøver at tilsidesætte identitetsværdierne, kan du blot fjerne den kolonne fra din INSERT udmelding.

Så jeg kan ændre den tidligere erklæring til dette:

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

SELECT * FROM Cities;

Resultat:

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

Begrænsninger for IDENTITY()-egenskaben

Identitetsegenskaben på en kolonne garanterer følgende:

  • Hver ny værdi genereres baseret på den aktuelle seed og stigning.
  • Hver nye værdi for en bestemt transaktion er forskellig fra andre samtidige transaktioner på bordet.

Det garanterer ikke følgende:

  • Værdiens unikke karakter
  • Fortløbende værdier i en transaktion
  • Fortløbende værdier efter servergenstart eller andre fejl
  • Genbrug af værdier (f.eks. når en INSERT operation mislykkes)

For mere information om disse begrænsninger, se Microsoft-dokumentationen.


  1. Hvorfor er det hurtigere at udføre lagrede procedurer end SQL-forespørgsler fra et script?

  2. INSERT IGNORE vs INSERT ... PÅ DUBLIKAT NØGLOPDATERING

  3. Hvordan bestilles efter to kolonner i SQL?

  4. Sorten, der spilder til niveau 15.000