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

Warum gibt es Lücken in den Werten meiner IDENTITY-Spalte?

Die Identitätseigenschaft einer Spalte garantiert Folgendes nicht :

Eindeutigkeit des Werts – Eindeutigkeit muss erzwungen werden, indem eine PRIMARY KEY- oder UNIQUE-Einschränkung oder ein UNIQUE-Index verwendet wird.

Aufeinanderfolgende Werte innerhalb einer Transaktion – Es ist nicht garantiert, dass eine Transaktion, die mehrere Zeilen einfügt, aufeinanderfolgende Werte für die Zeilen erhält, da andere gleichzeitige Einfügungen in der Tabelle auftreten können. Wenn Werte fortlaufend sein müssen, sollte die Transaktion eine exklusive Sperre für die Tabelle verwenden oder die Isolationsstufe SERIALIZABLE verwenden.

Aufeinanderfolgende Werte nach Serverneustart oder anderen Fehlern –SQL Server kann Identitätswerte aus Leistungsgründen zwischenspeichern und einige der zugewiesenen Werte können während eines Datenbankausfalls oder Serverneustarts verloren gehen. Dies kann beim Einfügen zu Lücken im Identitätswert führen. Wenn Lücken nicht akzeptabel sind, sollte die Anwendung einen Sequenzgenerator mit der NOCACHE-Option verwenden oder ihren eigenen Mechanismus verwenden, um Schlüsselwerte zu generieren.

Wiederverwendung von Werten – Für eine bestimmte Identitätseigenschaft mit einem bestimmten Startwert/Inkrement werden die Identitätswerte von der Engine nicht wiederverwendet. Wenn eine bestimmte Einfügeanweisung fehlschlägt oder die Einfügeanweisung rückgängig gemacht wird, gehen die verbrauchten Identitätswerte verloren und werden nicht erneut generiert. Dadurch können Lücken bei der Generierung der nachfolgenden Identitätswerte entstehen.

Auch

Wenn eine Identitätsspalte für eine Tabelle mit häufigen Löschungen vorhanden ist, können Lücken zwischen Identitätswerten auftreten. Wenn dies ein Problem darstellt, verwenden Sie die IDENTITY-Eigenschaft nicht. Allerdings, um sicherzustellen, dass keine Lücken entstanden sind, oder um eine bestehende Lücke zu füllen , werten Sie die vorhandenen Identitätswerte aus, bevor Sie explizit einen mit SET IDENTITY_INSERT ON eingeben .

Überprüfen Sie auch die Eigenschaften der Identitätsspalte und den Wert für das Identitätsinkrement. Es sollte 1 sein.