2010-05-08 5 views
5

hey alle. Ich habe eine Tabelle in meiner DB, die etwa tausend Datensätze enthält. Ich möchte die Identitätsspalte zurücksetzen, so dass alle IDs wieder sequenziell sind. Ich war bei this suchen, aber ich gehe davon aus, dass es nur auf eine leere Tabelle arbeitetSQL Reset Identität ID in bereits befüllten Tabelle

Aktuelle Tabelle

ID | Name 
1   Joe 
2   Phil 
5   Jan 
88   Rob 

Gewünschte Tabelle

ID | Name 
1   Joe 
2   Phil 
3   Jan 
4   Rob 

Vielen Dank im Voraus

+0

Wird Ihre Identity-Spalte an anderer Stelle als Fremdschlüssel verwendet? – uhleeka

+0

nein, es ist nur einzigartig, weil es ein anderes Feld in der Tabelle gibt, das darauf verweist. –

+0

IE: 'ID | ParentID | Name " –

Antwort

5

Der einfachste Weg, um eine Kopie der aktuellen Tabelle zu machen wäre, beheben Sie alle parentid Probleme auf, legen Sie es und dann die neue umbenennen.

Sie können auch vorübergehend die IDENTITY entfernen und versuchen, die Folowing:

;WITH TBL AS 
(
    SELECT *, ROW_NUMBER(ORDER BY ID) AS RN 
    FROM CURRENT_TABLE 
) 
UPDATE TBL 
SET ID = RN 

Oder, wenn Sie über die Reihenfolge der Datensätze sich nicht, diese

DECLARE INT @id; 
SET @id = 0; 

UPDATE CURRENT_TABLE 
SET @id = ID = @id + 1; 
-2

Verwendung DBCC CHECKIDENT. Die Tabelle muss nicht leer sein:

  • DBCC CHECKIDENT (table_name, NORESEED)

Aktuelle Identitätswert nicht zurückgesetzt wird. DBCC CHECKIDENT gibt den aktuellen Identitätswert und den aktuellen maximalen Wert der Identitätsspalte zurück. Wenn die beiden Werte nicht übereinstimmen, sollten Sie den Identitätswert auf zurücksetzen, um mögliche Fehler oder Lücken in der Folge von Werten zu vermeiden.

  • DBCC CHECKIDENT (table_name) oder DBCC CHECKIDENT (table_name, RESEED)

Falls der aktuelle Kennwert für eine Tabelle kleiner als der maximalen Identitätswert in der Spalte Identität gespeichert, es wird zurückgesetzt, um den maximalen Wert in der Identität unter Verwendung von Säule.

  • DBCC CHECKIDENT (table_name, RESEED, new_reseed_value)

Aktuelle Identitätswert wird auf den new_reseed_value gesetzt. Wenn keine Zeilen wurden in die Tabelle eingefügt, da die Tabelle erstellt wurde, oder wenn alle Zeilen unter Verwendung der TRUNCATE TABLE-Anweisung entfernt worden ist, die erste Zeile eingefügt, nachdem Sie DBCC CHECK laufen verwendet new_reseed_value als Identität. Andernfalls verwendet die nächste Zeile new_seed_value + den aktuellen Inkrementwert.

Wenn die Tabelle nicht leer ist, die Einstellung des Identität Wert auf eine Zahl kleiner als der Maximalwert in der Identität Spalt in einen der folgenden Bedingungen führen:

  • Wenn ein Primär KEY- oder UNIQUE-Einschränkung für die Identität Spalte vorhanden ist, wird die Fehlermeldung 2627 bei späteren Einfügeoperationen in die Tabelle generiert, da der generierte Identitätswert im Konflikt mit existiert Werte.

  • Wenn ein Primärschlüssel oder UNIQUE-Einschränkung nicht existiert, wird später Einfügeoperationen in doppelte Identitätswerte zur Folge haben.

+0

Das funktioniert nicht. Wie der Artikel sagt, wenn ich 'DBCC CHECKIDENT (table_name, RESEED, new_seed_value)' dann kann ich nicht neue Datensätze einfügen, wo die alten Datensätze derzeit sind. Es sieht so aus, als ob die einzige Möglichkeit, dies zu tun, darin besteht, die Daten in eine neue Tabelle einzufügen (die IDs neu zu erstellen), die alte Tabelle zu löschen und dann die neue Tabelle in den alten Tabellennamen umzubenennen. –

+0

Dies ändert nur den nächsten Einfügewert der Identität; Aktualisieren Sie die vorhandenen Identitätswerte nicht. –

1

Schnell Lösung wäre, zu:

  1. eine neue Tabelle mit dem gleichen Schema erstellen
  2. kopieren Sie die alte Tabelle in die neue (mit Ausnahme der Identitätsspalte)
  3. die alte Tabelle
1

Weil Sie Fremdschlüssel in der gleichen Tabelle haben (pro Ihren Kommentar

  • benennen Sie die neue Tabelle löschen), müssen Sie das Mapping von alt nach neu irgendwo beibehalten und die Fremdschlüssel neu einrichten, um die neuen Identitäten zu erfüllen.

    Es gibt eine Reihe von Ansätzen, dies zu tun, aber ich würde stark die Notwendigkeit in Frage stellen, Ihre Primärschlüssel zu aktualisieren, besonders da Sie bereits Fremdschlüssel auf sie verweisen, und es ist nur ein Ersatzschlüssel. Es ist nicht so, dass Sie Ihren Ersatzschlüssel in eine GUID oder etwas Spezielles ändern.

  • 3

    eine Art und Weise, wickeln diese in einer Transaktion

    select id,name into #temp from YourTable 
    
         truncate table YourTable 
    
         insert YourTable (name) 
         select name from #temp 
    
    +0

    sehr nett! elegant und einfach. – uhleeka

    +0

    , aber es repariert Ihre ParentID nicht. – mdma

    +4

    gab es nichts über parentid in der Frage, als ich es beantwortete – SQLMenace

    0

    Hier ist, wie ich zurückgesetzt Identität Felder aus. Der CTE (Common Table Expression) über der Version ist Overkill. Verwenden Sie einfach die aktuelle Zeilennummer der Identitätsspalte mit einem einfachen Update-Anweisung mit einem Join zu aktualisieren:

    UPDATE [YourTable] SET ID = rn.RowNumber FROM [YourTable] 
    JOIN (SELECT ID, ROW_NUMBER() OVER (ORDER BY ID) AS RowNumber 
        FROM [YourTable]) rn ON rn.ID = [YourTable].ID 
    

    Diese Aussage Refactoring kann noch einfacher zu sein. Wenn ja, würde ich gerne die einfachere Version sehen.

    Ich hoffe, das hilft jemandem.

    Verwandte Themen