2010-12-02 16 views
2

Ich arbeite an "Bereinigung" einer Datenbank und muss die IDENTITY-Spalten synchronisieren. Ich verwende gespeicherte Prozeduren, um die Daten zu verarbeiten und sie von einer Tabelle zur nächsten zu spiegeln (nachdem sie bereinigt und die Datentypen korrigiert wurden). Irgendwann in der Zukunft werde ich die alte Tabelle abschneiden und nur die neue Tabelle verwenden wollen, meine Frage ist, wie das IDENTITY-Feld synchron bleibt, während sie beide benutzt werden ... Sobald die alte Tabelle entfernt ist, wird die neue muss fortfahren automatisch inkrementieren und neu aufbauen/ändern, um das IDENTITY-Feld zu ändern ist keine Option. Ist das möglich oder gibt es einen besseren Weg?Mehrere SQL-Tabellen mit synchronisierten IDENTITY-Spalten

Mein anderer Gedanke war, eine Nachschlagetabelle zu erstellen, um die ID-Spalten beider Tabellen zu speichern, und immer wenn ein Insert in die neue Tabelle eingefügt wird, nehmen Sie die alte ID und die neue ID und fügen Sie sie in die Nachschlagetabelle ein. Das ist irgendwie unordentlich, sobald der alte Tisch aus dem Weg ist.

Antwort

1
  1. Legen Sie die Identität der neuen Tabelle als Nicht-Identitätsfeld fest.
  2. Ändern Sie Ihre Datenpopulationsprozeduren, um das Nicht-Identitätsfeld in Ihrer neuen Tabelle mit dem Identitätswert der alten Tabelle aufzufüllen.
  3. Bei der Umstellung, wechseln Sie Ihr neues Feld zu Auto-Inkrement und set the seed number entsprechend.
+0

Wird für die Änderung eines Nicht-Identitätsfelds zur Identität eine Neuerstellung der Tabelle benötigt? – jon3laze

+0

Welchen SQL Server benutzen Sie? Für MS SQL, nein. Hinzufügen eines Links oben zum entsprechenden MSDN-Artikel –

+0

Ja MSSQL. Danke für den Artikel. – jon3laze

3

Da gewesen, das getan. Setzen Sie die alte ID als FK in die neue Tabelle. Löschen Sie diese Spalte, bevor Sie die alte Tabelle löschen.

+0

ich mag diese Idee (+1). Bevor Sie Ihre NEW-Tabelle verwenden, ändern Sie den Typ in ein Identitätsfeld? –

+0

+1 Ich mag diese Idee, aber ich vergaß zu erwähnen, dass Datensätze hinzugefügt werden würden, die nicht in der alten Tabelle enthalten wären. Meine Lösung besteht darin, das ID-Feld in der neuen Tabelle in ein Nicht-Identitätsfeld zu ändern und einen Trigger auf die alte Tabelle zu setzen, um die neue Tabelle zu füllen. Dann auf Cut-over werde ich zur Identität wechseln. – jon3laze

+0

Nein, nein. Die neue Tabelle erhält ein eigenes ID-Feld. Alte oder neue Datensätze erhalten die neue ID, wenn sie in die neue Tabelle eingefügt werden. new_table.old_id ist standardmäßig auf null gesetzt, aber wenn Sie Datensätze aus der alten Tabelle kopieren, geben Sie old_id den Wert von old_table, id: insert new_table (c1, c2, old_id) select c1, c2, id aus old_table; – tpdi