2016-03-28 7 views
0

Ich habe eine SQL Server-Datenbank geerbt und aus irgendeinem Grund wird der Primärschlüssel nicht richtig inkrementiert.Wie ordne ich den Primärschlüssel einer Tabelle neu oder erhöht ihn automatisch, wenn er nicht richtig inkrementiert wird?

Zum Beispiel kann die PK für den letzten Datensatz in der Tabelle ist 120350

Dann, wenn ich einen neuen Datensatz in die Tabelle ein, es wird die PK 48377

Was ist der beste Weg wäre, die ursprüngliche PK für neue Datensätze neu anordnen oder festlegen? Dies ist für Microsoft SQL Server 2008 R2.

+2

Sie können Ihre Identität neu erstellen. https://msdn.microsoft.com/en-us/library/ms176057.aspx Ich wäre extrem besorgt über eine Identität, die plötzlich weniger als die maximalen Werte war. Dies ist ein Hinweis darauf, dass entweder eine erneute Suche stattgefunden hat oder dass einige Daten mit identity_insert erstellt wurden. Sie müssen herausfinden, was dort passiert ist und warum. –

+0

Ja, ich habe keine Ahnung, wo ich überhaupt hinschauen soll. Diese Tabelle wird verwendet, um Versanddaten aus unseren USPS- und UPS-Programmen zu senden. Es sollte nur in die nächste inkrementelle Zeile geschrieben werden. –

+0

Abhängig von der Version von SQL Server wird es Lücken geben. Mit 2008+ gibt es ein dokumentiertes Verhalten, dass nach einem Serverneustart Lücken entstehen. Die Werte sollten jedoch nicht kleiner als die Anzahl der vorhandenen Zeilen sein, vorausgesetzt, Ihre Schritteinstellung für die Identitätseigenschaft ist positiv. –

Antwort

0
DBCC CHECKIDENT('<tablename>'); 

Dadurch wird die Identitätsspalte an die richtige Stelle gesetzt (in diesem Fall 120351). Wenn Sie den vorhandenen Wert neu anordnen möchten, müssen Sie SET IDENTITY_INSERT '<tablename>' ON als Teil eines Skripts verwenden, um die Zeilen zu verschieben. Wie Sie das tun, hängt davon ab, was genau Sie erreichen möchten. Beachten Sie, dass Sie alle Fremdschlüssel synchron halten müssen.

Wenn Sie andere Anforderungen an die Spalte haben, die definiert "Inkrementiert richtig", dann benötigen Sie möglicherweise etwas neben einer IDENTITY Spalte.

+0

Sie können keine Zeilen verschieben. Eine Identitätsspalte kann nicht aktualisiert werden, selbst wenn IDENTITY_INSERT aktiviert ist. Um diese Werte zu "ändern", müssen Sie löschen und einfügen mit dem neuen Wert. –

+0

Wenn ich 'DBCC CHECKIDENT ('UPS_Worldship_Export') verwende;' dies ist das Ergebnis: Identitätsinformationen prüfen: aktueller Identitätswert '48377', aktueller Spaltenwert '120351'. Das Hinzufügen einer neuen Zeile wird immer noch als 48377 festgelegt. Irgendwelche Ideen? –

+0

Ein delete und ein insert ... also "verschiebe diese Zeilen herum". –

0

Wenn ich

DBCC CHECKIDENT('UPS_Worldship_Export'); 

bekam ich dieses Ergebnis: Überprüfung Identitätsinformationen: aktuellen Identitätswert '48377', aktuellen Spalt Wert '120351'.

Irgendwie war der Wert außerhalb der Spur. Dank der obigen Kommentare habe ich den Wert auf den höchsten Wert zurückgesetzt und er funktioniert jetzt korrekt.

DBCC CHECKIDENT (',<table name>', RESEED, <current column value>); 
Verwandte Themen