Primärschlüssel neu nummerieren

7

Wie würde ich den Primärschlüssel-Zähler in einer SQL-Tabelle zurücksetzen und jede Zeile mit einem neuen Primärschlüssel aktualisieren?

    
Aaron Fischer 23.10.2008, 14:42
quelle

6 Antworten

14

Ich würde zuerst eine andere Spalte zur Tabelle hinzufügen, diese mit dem neuen PK füllen.

Dann würde ich update-Anweisungen verwenden, um die neuen fk-Felder in allen verwandten Tabellen zu aktualisieren.

Dann können Sie die alten PK- und alten fk-Felder löschen.

BEARBEITEN: Ja, wie Ian sagt, müssen Sie alle Fremdschlüsseleinschränkungen löschen und neu erstellen.

    
Galwegian 23.10.2008, 14:45
quelle
6

Nicht sicher, welches DBMS Sie verwenden, aber wenn es sich um SQL Server handelt:

%Vor% Mit

können Sie die Primärschlüsselspalte aktualisieren / einfügen. Dann, wenn Sie fertig sind, die Schlüssel zu aktualisieren (Sie könnten einen CURSOR dafür verwenden, wenn die Logik ist kompliziert)

%Vor%

Hoffe das hilft!

    
Zachary Yates 23.10.2008 15:07
quelle
2

Dies kann MS SQL-spezifisch sein oder nicht, aber: TRUNCATE TABLE setzt den Identitätszähler zurück, also wäre eine Möglichkeit, dies schnell und schmutzig zu tun 1) Mach ein Backup 2) Kopiere Tabelleninhalte in temporäre Tabelle: 3) Kopieren Sie den Inhalt der temporären Tabelle zurück in die Tabelle (mit der Identitätsspalte):

%Vor%     
Codewerks 23.10.2008 14:51
quelle
1

Warum würdest du überhaupt stören? Der Hauptpunkt der Zähler-basierten "Identität" Primärschlüssel ist, dass die Zahlen willkürlich und bedeutungslos sind.

    
Tony Andrews 23.10.2008 15:20
quelle
1

Sie könnten es in den folgenden Schritten tun:

  • Erstellen Sie eine Kopie Ihrer Tabelle mit der zusätzlichen Spalte new_key
  • befüllen copyOfYourTable mit den betroffenen Zeilen von yourTable zusammen mit den gewünschten Werten von new_key
  • Einschränkungen vorübergehend deaktivieren
  • Aktualisieren Sie alle verwandten Tabellen so, dass sie auf den Wert von new_key anstelle von old_key
  • zeigen
  • lösche betroffene Zeilen von yourTable
  • SET IDENTITY_INSERT [IhreTabelle] EIN
  • fügt betroffene Zeilen erneut mit dem neuen korrekten Wert des Schlüssels (aus der Kopiertabelle)
  • ein
  • SET IDENTITY_INSERT [IhreTabelle] OFF
  • reseed Identität
  • Restriktionen erneut aktivieren
  • lösche copyOfYurtable

Aber wie andere gesagt haben, ist diese Arbeit nicht nötig. Ich neige dazu, die Primärschlüssel des Identitätstyps so zu betrachten, als wären sie Zeigern in C gleichwertig, ich benutze sie, um auf andere Objekte zu verweisen, aber ändere sie niemals explizit,

    
kristof 23.10.2008 15:41
quelle
-1

Wenn dies der SQL-Server von Microsoft ist, können Sie das [dbcc checkident] ( Ссылка

Nehmen wir an, Sie haben eine einzige Tabelle, in der Sie Daten umherbewegen und die Primärschlüssel neu nummerieren möchten. In diesem Beispiel lautet der Name der Tabelle ErrorCode . Es hat zwei Felder, ErrorCodeID (das ist der Primärschlüssel) und eine Beschreibung .

Beispielcode Verwenden von dbcc checkident

%Vor%

In diesem Beispiel werden Sie alle Zeilen effektiv in einen anderen Primärschlüssel verschieben und dann zurücksetzen, so dass die nächste Einfügung eine 8000 ID annimmt.

Hoffe das hilft ein bisschen!

    
Scott Saad 23.10.2008 16:10
quelle

Tags und Links