Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So verwenden Sie die IDENTITY()-Eigenschaft in SQL Server

Wenn Sie T-SQL zum Erstellen (oder Ändern) einer Tabelle in SQL Server verwenden, haben Sie die Möglichkeit, IDENTITY() zu verwenden -Eigenschaft zum Erstellen einer Identitätsspalte.

Eine Identitätsspalte enthält eine automatisch inkrementierende Identifikationsnummer. Die IDENTITY() Eigenschaft kann mit CREATE TABLE verwendet werden und ALTER TABLE Aussagen.

Syntax

Die Syntax lautet wie folgt:

IDENTITY [ (seed , increment) ]

Der Seed ist der Wert, der für die allererste in die Tabelle geladene Zeile verwendet wird.

Das Inkrement ist der inkrementelle Wert, der zum Identitätswert der vorherigen geladenen Zeile hinzugefügt wird.

Sie müssen beide Argumente oder keines angeben. Wenn Sie nichts angeben, ist der Standardwert (1,1) .

Beispiel 1 – Grundlegende Verwendung

Hier ist ein Beispiel zur Veranschaulichung.

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

Dieser Code erstellt eine Tabelle mit zwei Spalten. Die erste Spalte (PetId ) ist eine Identitätsspalte, da ich IDENTITY() verwende Eigentum in seiner Definition.

Nachdem ich nun eine Identitätsspalte erstellt habe, kann ich Haustiernamen in PetName einfügen Spalte, ohne dass für jede Zeile eine ID angegeben werden muss.

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

SELECT * FROM Pet;

Ergebnis:

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

Beispiel 2 – Unterschiedlicher Startwert und Inkrement

Hier ist ein Beispiel, das einen anderen Startwert und ein anderes Inkrement verwendet.

In diesem Fall beginnt der Seed bei 150 und wird für jede Zeile um 10 erhöht.

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

Fügen Sie nun einige Daten ein und wählen Sie sie aus:

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

SELECT * FROM Cities;

Ergebnis:

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

Beispiel 3 – Falsche Verwendung

Wie bereits erwähnt, müssen Sie beide Argumente angeben oder keines. Mit anderen Worten, Sie können nicht nur ein Argument liefern. Hier ist ein Beispiel dafür, was passiert, wenn Sie nur ein Argument angeben.

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

Ergebnis:

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

Beispiel 4 – Versuch, die Identitätswerte zu überschreiben

Wenn Sie versuchen, die automatischen Identitätswerte zu überschreiben, erhalten Sie möglicherweise eine Fehlermeldung wie diese.

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

Ergebnis:

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.

Dies liegt daran, dass Sie versuchen, die von IDENTITY() erstellten Werte zu überschreiben Eigentum. In vielen Fällen kann es sein, dass Sie einfach nicht wussten, dass es sich um eine Identitätsspalte handelt. In solchen Fällen müssen Sie lediglich die Identitätsspalte aus Ihrem INSERT entfernen Aussage.

Allerdings, wenn Sie es wirklich tun müssen IDENTITY() überschreiben -Eigenschaft finden Sie unter Einfügen von Werten in eine IDENTITY-Spalte in SQL Server.

Wie bereits erwähnt, können Sie diese Spalte einfach aus Ihrem INSERT entfernen, wenn Sie die Identitätswerte nicht überschreiben müssen Erklärung.

So kann ich die vorherige Anweisung wie folgt ändern:

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

SELECT * FROM Cities;

Ergebnis:

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

Einschränkungen der IDENTITY()-Eigenschaft

Die Identitätseigenschaft einer Spalte garantiert Folgendes:

  • Jeder neue Wert wird basierend auf dem aktuellen Startwert und Inkrement generiert.
  • Jeder neue Wert für eine bestimmte Transaktion unterscheidet sich von anderen gleichzeitigen Transaktionen in der Tabelle.

Folgendes wird nicht garantiert:

  • Eindeutigkeit des Werts
  • Aufeinanderfolgende Werte innerhalb einer Transaktion
  • Aufeinanderfolgende Werte nach Serverneustart oder anderen Fehlern
  • Wiederverwendung von Werten (z. B. wenn ein INSERT Vorgang schlägt fehl)

Weitere Informationen zu diesen Einschränkungen finden Sie in der Microsoft-Dokumentation.