Wechsel von Ints zu GUIDs als Primärschlüssel

7

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?

    
Alexander Prokofyev 26.09.2008, 07:40
quelle

8 Antworten

11
  • Erstellen Sie eine neue Spalte für die GUID Wert in der Master-Tabelle. Benutze die uniqueidentifier Datentyp, mach es nicht Null mit einem newid () Standard so Alle vorhandenen Zeilen werden ausgefüllt.
  • Erstellen Sie neue uniqueidentifier-Spalten in den untergeordneten Tabellen.
  • Führe Update-Anweisungen aus, um die Gildenbeziehungen zu erstellen, indem du die vorhandenen int-Beziehungen verwendest, um auf die Entitäten zu verweisen.
  • Löschen Sie die ursprünglichen int-Spalten.

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.

    
Andy Jones 26.09.2008, 07:48
quelle
4

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

  1. Legen Sie die neuen GUIDs in der Primärschlüsseltabelle
  2. fest
  3. Führe das aus:

.

%Vor%     
Glenn Slaven 26.09.2008 07:42
quelle
3

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 -Handler verwaltet wird, das System. Stattdessen benötigen Sie einen Mechanismus wie einen GUID-Generator, um einen Primärschlüssel zu erstellen (beachten Sie, dass die wahre Eigenschaft eines Primärschlüssels seine Eindeutigkeit ist). Also kann ich mit mehreren Diensten skalieren, von denen jeder unabhängig voneinander seinen Primärschlüssel erstellt.

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.

    
magius 26.09.2008 08:18
quelle
2

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 ....

    
Mike Stone 26.09.2008 07:46
quelle
0

Ich denke, Sie müssen es manuell tun. Oder Sie können ein Dienstprogramm dafür schreiben. Das Szenario sollte lauten:

  • Dupliziere die "int" PK / FK-Spalten mit neuen "guid" -Spalten.
  • Erzeugt neue Werte für "guid" PK-Spalten.
  • Werte in "guid" FK-Spalten mit angegebenen Werten aktualisieren (Sie finden die Datensätze über "int" PK).
  • Entfernen Sie Referenzen (Relationen) mit "int" PK / FK-Spalten.
  • Erstellen Sie ähnliche Referenzen (Relationen) mit "guid" PK / FK-Spalten.
  • Entfernen Sie "int" PK / FK-Spalten.
TcKs 26.09.2008 07:47
quelle
0

Komisch Ich denke, ich muss das genaue Gegenteil tun wegen eines anderen Problems ...

Wie kann SQLBulkCopy in einer Tabelle mit einem GUID-Primärschlüssel und standardmäßig newsequentialid ()?

verwendet werden     
Michael 26.09.2008 08:37
quelle
0

Es 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.

    
bernardn 26.09.2008 08:45
quelle
0

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.

    
Keith Williams 26.09.2008 08:49
quelle

Tags und Links