Ich verwende mehrere referenzierte Tabellen mit ganzzahligen Primärschlüsseln. Jetzt möchte ich ints in GUIDs ändern und alle Referenzen intakt lassen. Was ist der einfachste Weg, um es zu tun?
Danke!
Zusatz
Ich verstehe den Prozess im Allgemeinen, deshalb brauche ich detailliertere Ratschläge, zum Beispiel, wie man eine neue GUID-Spalte füllt. Verwenden Sie den Standardwert newid () ist korrekt, aber was für bereits vorhandene Zeilen?
Lassen Sie außerdem etwas Platz auf Ihren Daten / Indexseiten (geben Sie fillfactor & lt; 100 ein), da die Guides nicht sequentiell sind wie die int-Identitätsspalten. Dies bedeutet, dass Einfügungen an beliebiger Stelle im Datenbereich sein können und Seitenaufteilungen verursachen, wenn Ihre Seiten zu 100% voll sind.
Erstens: Lieber Gott, warum?!?!?
Zweitens müssen Sie zuerst die GUID-Spalte zu allen Ihren Tabellen hinzufügen und sie dann basierend auf dem int-Wert auffüllen. Danach können Sie die GUIDs auf primäre / Fremdschlüssel setzen und dann die int-Spalten löschen.
Um den Wert zu aktualisieren, machen Sie etwas wie
.
%Vor% Dies ist relevant in einem System, das das verteilte Rechenmodell implementiert. Wenn das System den Primärschlüssel zu dem Zeitpunkt wissen muss, zu dem Sie Informationen im System beibehalten, verlangsamt die Verwendung eines automatisch inkrementierenden Primärschlüssels, der von
Ich hatte das zweifelhafte Privileg, dies vorher zu tun, und im Grunde musste ich die ganze verdammte Datenbank in XML exportieren. Als nächstes hatte ich eine Java-Anwendung, die die nextLong () -Funktion von java.util.Random verwendet, um den Primärschlüssel durch die neuen GUID-Schlüssel zu ersetzen. Danach habe ich das Ganze wieder in die Datenbank importiert.
Natürlich habe ich beim ersten Mal, als ich versucht habe, die XML-Dateien zu importieren, vergessen, die automatische Nummerierung des Primärschlüsselfeldes auszuschalten, also lerne aus meinen Fehlern. Ich bin mir sicher, dass es bessere Möglichkeiten gibt, dies zu tun, aber das war eine schnelle und schmutzige Art, es zu tun ... und es hat funktioniert. Falls Sie sich wundern, sollte das Projekt die Anwendung skalieren.
Ja, ich bin bei Glenn ... Ich habe eigentlich gezögert, dasselbe zu posten, bevor er es gepostet hat ...
Warum sollten Sie keinen von der GUID getrennten Autoinkrement-Primärschlüssel verwenden? Es ist viel flexibler und Sie können die GUID-Spalte einfach indexieren lassen, damit Sie eine gute Leistung für Ihre Abfragen haben ...
Was die Flexibilität angeht, möchte ich meine IDs als Autoinkrement-Ints behalten, da sich dann der andere scheinbar einzigartige und für den Primärschlüssel geeignete Artikel ändern kann.
Ein großer Fall der Flexibilität ist, wenn Sie Benutzernamen als Primärschlüssel verwenden. Auch wenn sie einzigartig sind, ist es schön, sie ändern zu können. Was ist, wenn Benutzer eine E-Mail-Adresse als Benutzernamen verwenden? Die Möglichkeit, den Benutzernamen zu ändern und nicht alle Ihre Abfragen zu beeinflussen, ist ein großes Plus, und ich vermute, das könnte auch mit Ihren GUIDs stimmen ....
Ich denke, Sie müssen es manuell tun. Oder Sie können ein Dienstprogramm dafür schreiben. Das Szenario sollte lauten:
Komisch Ich denke, ich muss das genaue Gegenteil tun wegen eines anderen Problems ...
verwendet werdenEs ist eine sehr gute Wahl. Ich wechselte von Longs zu UUID für eine meiner Anwendungen und ich bereue es nicht. Wenn Sie MS SQL Server verwenden, ist es im Standard enthalten (ich verwende postgresql und es ist nur im Standard ab 8.3 enthalten).
Wie erwähnt von Glenn Slaven , Sie kann UUIDs aus den Schlüsseln neu erstellen, die Sie in Ihren aktuellen Datensätzen haben. Sei dir bewusst, dass sie nicht einzigartig sein werden, aber auf diese Weise ist es einfach, die Beziehungen intakt zu halten. Neue Datensätze, die Sie nach dem Verschieben erstellen, sind eindeutig.
TUN SIE ES NICHT! Wir begannen mit GUIDs und jetzt sind wir fast fertig mit INTs als PKs. Wir behalten die GUID für Protokollierungszwecke (und für einige Tabellen von, er, "verhandelbare relationale Integrität";)), aber die Geschwindigkeitserhöhung der Verwendung von Ints war phänomenal.
Das wurde erst wirklich deutlich, als sich die Zeilen der Tabelle in Millionen malten, wohlgemerkt.
Unsere größte Torheit war bei weitem die Verwendung einer NEWID () als PK unserer (sequenziellen) Protokolltabelle - es gab viel Kopfzerbrechen, als wir unseren Fehler bemerkten.
Tags und Links sql sql-server database-design