SQL WÄHLEN SIE INSERT INTO Eindeutige ID erzeugen

7

Ich versuche, eine Tabelle von Daten auszuwählen und diese Daten in eine andere Datei mit ähnlichen Spaltennamen einzufügen (es sind im Wesentlichen doppelte Daten). Aktuelle Syntax wie folgt:

%Vor%

Das Problem, das ich habe, erzeugt eindeutige Schlüsselfelder (deklariert als Ganzzahlen) für die neu eingefügten Datensätze. Ich kann die Schlüssel von Tabelle2 nicht verwenden, da Tabelle1 über vorhandene Daten verfügt und bei doppelten Schlüsselwerten ein Fehler auftritt.

Ich kann das Tabellenschema nicht ändern, und dies sind benutzerdefinierte ID-Spalten, die nicht automatisch von der Datenbank generiert werden.

    
user1464435 18.06.2012, 18:01
quelle

9 Antworten

7

Hat table1 ein Auto-Increment für sein ID-Feld? Wenn ja, können Sie ähnlicheId aus der Einfügung verlieren und die automatische Inkrementierung um eindeutige Schlüssel kümmern?

%Vor%     
alex stacey 18.06.2012 18:09
quelle
5

Ich bin mir nicht sicher, ob ich Sie richtig verstanden habe: Sie möchten alle Daten aus TABLE2 kopieren, aber stellen Sie sicher, dass TABLE2.similarId nicht bereits in TABLE1.id vorhanden ist, vielleicht ist dies eine Lösung für Ihr Problem:

%Vor%

Die Einfügung wird jetzt wegen der Primärschlüsselverletzung nicht fehlschlagen, weil jede eingefügte ID größer ist als die ID, die dort bereits vorhanden war.

    
Jarek Bielicki 10.08.2012 14:09
quelle
5

Gemäß Ihrer Anforderung müssen Sie wie folgt abfragen:

%Vor%

Was habe ich hier gemacht:
Hinzugefügt ROW_NUMBER() , das von 1 beginnt, also auch hinzugefügt MAX() Funktion für die ID der Zieltabelle.

Zur besseren Erläuterung Siehe dieses SQLFiddle.

    
hims056 16.08.2012 06:15
quelle
3

Wenn das ID-Feld als Auto-ID definiert ist und Sie es aus der INSERT-Anweisung herauslassen, generiert sql eindeutige IDs aus dem verfügbaren Pool.

    
colonelclick 18.06.2012 18:10
quelle
2

In SQL Server haben wir die Funktion ROW_NUMBER, und wenn ich Sie richtig verstanden habe, wird der folgende Code tun, was Sie brauchen:

%Vor%

ROW_NUMBER bringt die Nummer jeder Zeile und Sie können einen "magischen Wert" hinzufügen, um diese Werte von der aktuellen maximalen ID von TABLE1 zu unterscheiden. Nehmen wir an, Ihre aktuelle maximale ID ist 6. Wenn Sie dann 6 zu jedem Ergebnis von ROW_NUMBER hinzufügen, erhalten Sie 7, 8, 9 und so weiter. Auf diese Weise haben Sie nicht die gleichen Werte für den Primärschlüssel von TABLE1.

Ich habe Google gefragt und mir gesagt, dass Sybase auch die Funktion ROW_NUMBER hat ( Ссылка ), also denke ich, dass Sie es versuchen können.

    
Fabio 10.08.2012 04:35
quelle
2

Wenn Sie eine identische Tabelle erstellen möchten, warum nicht einfach (schnell und schmutzig) Wählen Sie die INTO-Methode?

%Vor%

Hoffnung Das hilft.

    
JsChoice 15.08.2012 09:31
quelle
1

Machen Sie die table1 ID IDENTITY, wenn es keine benutzerdefinierte ID ist.

oder

Erstellen Sie einen neuen Primärschlüssel in table1 und machen Sie ihn IDENTITY, und Sie können die vorherigen IDs im selben Format (aber nicht im Primärschlüssel) behalten.

    
yoozz 18.06.2012 18:09
quelle
1

Sie können am besten eine zusätzliche Spalte in Table2 für Table1.Id hinzufügen. Auf diese Weise behalten Sie beide Schlüsselgruppen.

(Wenn Sie mit einer Datenzusammenführung beschäftigt sind, kann die Beibehaltung von Table1.Id für alle Fremdschlüssel wichtig sein, die möglicherweise weiterhin auf Table1.Id verweisen. Sie müssen dann Fremdschlüssel in Tabellen korrigieren, die auf Table1.Id verweisen. die nun auf den zutreffenden Schlüssel in Tabelle 2 verweisen müssen.

    
StuartLC 18.06.2012 18:09
quelle
0

Wenn Ihre zweite Tabelle ähnliche Werte wie in der ersten Tabelle haben soll, dann wenden Sie auto increment nicht auf die zweite Tabelle an.

    
Java Developers Guide 16.08.2012 13:12
quelle

Tags und Links