In diesem Artikel werden wir die Grundlagen und Details der SQL Server IDENTITY-Eigenschaft und der Funktionen der IDENTITY-Spalte untersuchen. Außerdem werden wir prüfen, wie explizite Werte in die Identitätsspalten über die IDENTITY_INSERT-Funktion eingefügt werden.
Einführung in die IDENTITY-Eigenschaft und IDENTITY-Spalte von SQL Server
In SQL Server ermöglicht uns die Identitätseigenschaft, Identitätsspalten in den SQL Server-Tabellen gemäß den Einstellungen der Identitätseigenschaftssyntax zu erstellen. Die Syntax der Identitätseigenschaft sieht wie folgt aus, und wir wenden diese Syntax an, um eine Tabellenanweisung zu erstellen oder zu ändern.
IDENTITÄT [(Startwert, Inkrement)]
Zunächst untersuchen wir die Parameter der Identitätseigenschaft. Diese Eigenschaft akzeptiert zwei Eingabeparameter:Der erste ist Seed und der zweite ist Increment. Der Seed-Parameter gibt an, dass der erste Startwert des in die Tabelle eingefügten Werts und der Increment-Parameter den Inkrementwert der eingefügten Daten definiert.
Diese prinzipielle Definition von Identitätseigenschaft werden wir nun mit einigen Beispielen vertiefen.
So erstellen Sie eine Identitätsspalte in SQL Server
Beispiel-1 :Im folgenden Beispiel erstellen wir eine Identitätsspalte und der erste Wert beginnt bei 1 und erhöht sich um 1 um 1.
DROP TABLE IF EXISTS TestIdentity CREATE TABLE TestIdentity (Id INT IDENTITY(1,1) , Col1 VARCHAR(100)) GO INSERT INTO TestIdentity VALUES ('The first inserted row') INSERT INTO TestIdentity VALUES ('The second inserted row') INSERT INTO TestIdentity VALUES ('The third inserted row') INSERT INTO TestIdentity VALUES ('The fourth inserted row') SELECT Id as [IdentityColumn],Col1 FROM TestIdentity
Beispiel-2 :Im folgenden Beispiel erstellen wir eine Identitätsspalte und der erste Wert beginnt bei 37 und erhöht 20 um 20.
DROP TABLE IF EXISTS TestIdentity CREATE TABLE TestIdentity (Id INT IDENTITY(37,20) , Col1 VARCHAR(100)) GO INSERT INTO TestIdentity VALUES ('The first inserted row') INSERT INTO TestIdentity VALUES ('The second inserted row') INSERT INTO TestIdentity VALUES ('The third inserted row') INSERT INTO TestIdentity VALUES ('The fourth inserted row') SELECT Id as [IdentityColumn],Col1 FROM TestIdentity
Wie Sie im obigen Beispiel sehen können, sorgt die Identitätseigenschaft für die Generierung der Auto-Inkrement-Werte gemäß Seed- und Identitätsparametern.
Wie füge ich explizite Werte in die Identitätsspalte von SQL Server ein?
Standardmäßig erlaubt uns die Identitätseigenschaft nicht, explizite Werte in die Identitätsspalten einzufügen. Wenn Sie versuchen, explizite Werte in eine Identitätsspalte einzufügen, tritt der folgende Fehler auf.
DROP TABLE IF EXISTS TestIdentity CREATE TABLE TestIdentity (Id INT IDENTITY(1,1) , Col1 VARCHAR(100)) GO INSERT INTO TestIdentity VALUES (1,'The first inserted row')
Nachricht 8101, Ebene 16, Zustand 1, Zeile 9
Ein expliziter Wert für die Identitätsspalte in table, „TestIdentity“ kann nur angegeben werden, wenn eine Spaltenliste verwendet wird und IDENTITY_INSERT eingeschaltet ist.
Wir können diesen Fehler beheben, indem wir die IDENTITY_INSERT-Funktion der Tabelle aktivieren. Nun ändern wir die Insert-Anweisung wie folgt.
DROP TABLE IF EXISTS TestIdentity CREATE TABLE TestIdentity (Id INT IDENTITY(1,1) , Col1 VARCHAR(100)) SET IDENTITY_INSERT TestIdentity ON INSERT INTO TestIdentity (Id,Col1) VALUES (1,'The first inserted row') SET IDENTITY_INSERT TestIdentity OFF SELECT * FROM TestIdentity
Ein weiterer wichtiger Punkt bei diesem Problem ist, dass wir eine Spaltenliste schreiben müssen, um die Anweisung einzufügen. Wenn wir dies nicht tun, tritt der folgende Fehler auf.
DROP TABLE IF EXISTS TestIdentity CREATE TABLE TestIdentity (Id INT IDENTITY(1,1) , Col1 VARCHAR(100)) SET IDENTITY_INSERT TestIdentity ON INSERT INTO TestIdentity VALUES (1,'The first inserted row') SET IDENTITY_INSERT TestIdentity OFF
Nachricht 8101, Ebene 16, Zustand 1, Zeile 9
Ein expliziter Wert für die Identitätsspalte in table, „TestIdentity“ kann nur angegeben werden, wenn eine Spaltenliste verwendet wird und IDENTITY_INSERT eingeschaltet ist.
Dieser Fehler definiert, dass die Spaltenliste in der Einfügeanweisung fehlt. In der folgenden Insert-Anweisung werden wir diesen Fehler beheben.
DROP TABLE IF EXISTS TestIdentity CREATE TABLE TestIdentity (Id INT IDENTITY(1,1) , Col1 VARCHAR(100)) SET IDENTITY_INSERT TestIdentity ON INSERT INTO TestIdentity (Id,Col1) ---column list VALUES (90,'The first inserted row') SET IDENTITY_INSERT TestIdentity OFF
In einigen Fällen müssen wir Daten aus einer anderen Tabelle in eine Tabelle einfügen. Eine der besten Möglichkeiten, diese Operation auszuführen, ist die Verwendung der „INSERT INTO SELECT“-Anweisungen. Wenn die Zieltabelle jedoch eine Identitätsspalte hat, müssen wir die Option IDENTITY_INSERT in der Zieltabelle aktivieren. Außerdem müssen wir die Spaltenliste der Zieltabelle schreiben.
DROP TABLE IF EXISTS TestIdentity DROP TABLE IF EXISTS SourceTable CREATE TABLE SourceTable (ID INT, Val1 VARCHAR(100)) INSERT INTO SourceTable VALUES (1,'First Row'),(2,'Second Row') GO CREATE TABLE TestIdentity (Id INT IDENTITY(1,1) , Col1 VARCHAR(100)) SET IDENTITY_INSERT TestIdentity ON INSERT INTO TestIdentity (Id,Col1) SELECT * FROM SourceTable SET IDENTITY_INSERT TestIdentity OFF
Der Nachteil der IDENTITY_INSERT-Option besteht darin, dass sie eine Lücke zwischen den Identitätsspaltenwerten verursachen kann. Eine Anweisung ähnlich der folgenden erzeugt eine Lücke zwischen den Identitätsspaltenwerten.
DROP TABLE IF EXISTS TestIdentity CREATE TABLE TestIdentity (Id INT IDENTITY(1,1) , Col1 VARCHAR(100)) INSERT INTO TestIdentity ---column list VALUES ('The first inserted row (INDENTITY_INSERT_OFF)') SET IDENTITY_INSERT TestIdentity ON INSERT INTO TestIdentity (Id,Col1) ---column list VALUES (90,'The second inserted row (INDENTITY_INSERT_ON') SET IDENTITY_INSERT TestIdentity OFF INSERT INTO TestIdentity ---column list VALUES ('The third inserted row (INDENTITY_INSERT_OFF)') SELECT * FROM TestIdentity
DBCC CHECKIDENT-Befehl
Mit dem Befehl DBCC CHECKIDENT können wir Details zum letzten Wert der Identitätsspalte abrufen. Diese Funktion ermöglicht auch das Zurücksetzen und Ändern des aktuellen Werts der Identitätsspalte auf einen anderen Wert. Jetzt erhalten wir den letzten Wert der Identität durch den Befehl DBCC CHECKIDENT.
DROP TABLE IF EXISTS TestIdentity CREATE TABLE TestIdentity (Id INT IDENTITY(1,1) , Col1 VARCHAR(100)) GO INSERT INTO TestIdentity VALUES ('The first inserted row') INSERT INTO TestIdentity VALUES ('The second inserted row') INSERT INTO TestIdentity VALUES ('The third inserted row') INSERT INTO TestIdentity VALUES ('The fourth inserted row') DBCC CHECKIDENT ('TestIdentity', NORESEED)
Eine weitere Option zum Befehl DBCC CHECKIDENT ist das Zurücksetzen der Identitätsspalte auf einen erforderlichen Wert. Im folgenden Beispiel ändert der RESEED-Parameter den Maximalwert der Identitätsspalte auf 100 und die anschließend eingefügten Werte verwenden diesen Maximalwert.
DROP TABLE IF EXISTS TestIdentity CREATE TABLE TestIdentity (Id INT IDENTITY(1,1) , Col1 VARCHAR(100)) GO INSERT INTO TestIdentity VALUES ('The first inserted row') INSERT INTO TestIdentity VALUES ('The second inserted row') INSERT INTO TestIdentity VALUES ('The third inserted row') INSERT INTO TestIdentity VALUES ('The fourth inserted row') GO DBCC CHECKIDENT ('TestIdentity',RESEED,100) GO INSERT INTO TestIdentity VALUES ('The fifth inserted row') SELECT * FROM TestIdentity
SQL Server-Identitätsspalte und Eindeutigkeit
Identitätsspalten garantieren nicht die Generierung eindeutiger Werte. Dies ist das häufig verwirrende Problem bei den Identitätsspalten. Wenn wir also die Eindeutigkeit der generierten Werte sicherstellen möchten, können wir den eindeutigen Index für diese Spalten verwenden. Jetzt werden wir beweisen und demonstrieren, wie doppelte Werte über den Identitätsspalten erstellt werden.
DROP TABLE IF EXISTS TestIdentity CREATE TABLE TestIdentity (Id INT IDENTITY(1,1) , Col1 VARCHAR(100)) SET IDENTITY_INSERT TestIdentity ON INSERT INTO TestIdentity (Id,Col1) VALUES (1,'The first inserted row (INDENTITY_INSERT_OFF)') INSERT INTO TestIdentity (Id,Col1) VALUES (1,'The first inserted row (INDENTITY_INSERT_OFF)') SET IDENTITY_INSERT TestIdentity OFF SELECT * FROM TestIdentity
Darüber hinaus sind Identitätsspalten und Primärschlüssel zwei unterschiedliche Objekte in SQL Server. Der Verwendungszweck der Identitätsspalte besteht darin, die automatisch inkrementierte Nummer zu generieren. Andererseits garantiert und stellt die Primärschlüsseleinschränkung die Eindeutigkeit der Werte in einer bestimmten Spalte bereit. Die Primärschlüsseleinschränkung erzwingt die eindeutigen Werte für die definierten Spalten, da der Primärschlüssel standardmäßig einen gruppierten eindeutigen Index in der Tabelle erstellt. In der allgemeinen Verwendung können die Primärschlüsseleinschränkung und die Identitätseigenschaft zusammen verwendet werden. Dieser Verwendungsansatz hilft uns, die Flexibilität der Eindeutigkeit des Primärschlüssels und der Funktion zum automatischen Inkrementieren der Identität in die angewendete Spalte zu bringen. Im folgenden Beispiel fügen wir der ID-Spalte auch eine Primärschlüssel-Einschränkung hinzu, die verhindert, dass eingefügte Werte dupliziert werden.
DROP TABLE IF EXISTS TestIdentity CREATE TABLE TestIdentity (Id INT IDENTITY(1,1) PRIMARY KEY, Col1 VARCHAR(100)) SET IDENTITY_INSERT TestIdentity ON INSERT INTO TestIdentity (Id,Col1) VALUES (1,'The first inserted row (INDENTITY_INSERT_OFF)') INSERT INTO TestIdentity (Id,Col1) VALUES (1,'The first inserted row (INDENTITY_INSERT_OFF)') SET IDENTITY_INSERT TestIdentity OFF SELECT * FROM TestIdentity
Wenn wir im Objekt-Explorer auf der Registerkarte „Indizes“ der TestIdentity-Tabelle navigieren, können wir einen eindeutigen gruppierten Index finden, der durch eine Primärschlüsseleinschränkung erstellt wurde. Diese Einschränkung erzwingt eindeutige Werte für die ID-Spalte.
Schlussfolgerung
In diesem Artikel haben wir die grundlegenden Konzepte und Verwendungsmethoden der SQL Server-Identitätseigenschaft und der Identitätsspalten besprochen.
Referenzen
- CREATE TABLE (Transact-SQL) IDENTITY (Eigenschaft)
- Primärschlüssel erstellen