2016-04-19 3 views
0

In einer Datenbank haben wir eine Tabelle wieNeuordnen der eindeutigen Schlüsselspaltenwert sequentiell

enter image description here

Hier Sequenz ist eindeutiger Schlüssel und zeigt im Wesentlichen die Position der Reihe in UI. Jetzt muss ich die Position von C2 zu C1 ändern, indem ich die C2-Sequenz auf 1 und die C1-Sequenz auf 2 ändere. So kann ich die Sequenz neu anordnen und die Sequenz für die Liste im Speicher neu anordnen.

Wie ich schon sagte Sequenz ist eindeutiger Schlüssel in der Datenbank (ich benutze Oracle-Datenbank), also, wenn ich versuche, die Bulk-Update-Abfrage zu begehen zeigt es eindeutige Schlüssel Contrain-Fehler. Ich habe eine Lösung unten aufgeführt.

Lösung 1

Deaktivieren Sie die eindeutigen Schlüssel Constraints und die Sequenz aktualisieren und dann den eindeutigen Schlüssel für die Tabelle aktivieren.

Lösung 2:

  1. Aktualisieren Sie die Folge von C2 bis Max (Sequenz) +1.
  2. Aktualisieren Sie die C1-Sequenz auf 2
  3. Aktualisieren Sie die C2-Sequenz auf 1. Auf diese Weise können wir den eindeutigen Schlüsselkonflikt vermeiden.

Beispiel:

Wir haben C2 zu C1-Position zu bewegen, so dass wir

  1. C2 aktualisieren => Max (Sequenz) + 1 => 5 + 1 => 6
  2. =
  3. C1> 2
  4. C2 => 1

Lösung 3

  1. Aktualisieren der Sequenz von C2

  2. Aktualisieren der Abfolge von C1 bis -1

  3. Rest All-Sequenz auch C2 ändern sollte auf -2 bis -3

  4. C4 o -4

Und dann die Änderung festschreiben und wieder die gesamte Sequenz auf (Sequenz) * (- 1) aktualisieren Noch einmal die Änderungen begehen.

Lösung 4

Wir löschen auch die beiden Zeilen aus der Datenbank und fügen Sie es erneut mit einer neu geordnet Sequenz.

Dies sind die vier Lösungen, die ich habe, aber alle drei sind nicht geeignet für die Leistung prospektiv.Bitte schlagen Sie mir den effizientesten Weg vor, um dieses Problem zu lösen. Ich verwende C# und Orakel

+0

Leistung kann nur gemessen werden, nicht wirklich daraus abgeleitet werden. Anzahl der Zeilen, zusätzliche Daten usw. beeinflussen dies. Aber zumindest würde ich nicht dafür sorgen, Zeilen zu löschen oder Einschränkungen zu ändern. Und 3 benötigt nicht alle Zeilen aktualisiert. Am Ende sind 2 und 3 genau gleich, nur etwas anders gemacht. Sie haben also wirklich eine Lösung. –

+0

@SamiKuhmonen ja. Lösung 2 und 3 sind fast gleich, nur die Implementierung ist anders. Eigentlich ist die ganze Lösung, die ich hier aufgelistet habe, nicht geeignet. Ich suche nach einer Stander-Lösung, falls vorhanden. –

Antwort

0

Ich denke, es ist der falsche Ansatz, den eindeutigen Schlüsselwert für vorhandene Zeilen zu aktualisieren. Tun Sie es umgekehrt und aktualisieren Sie den Rest der Spalten. z.B.

merge into yourtab f 
using (-- exchange values of seq 1 and 2 
     select 1 seq, 'C2' code, '1.2' name 
     from dual 
     union all 
     select 2, 'C1', '1.1' 
     from dual) src 
on (f.seq = src.seq) 
when matched then 
    update set code = src.code, name = src.name; 

btw Ich verstehe nicht, warum Sie seq aktualisieren müssen die Liste in UI neu zu ordnen, warum nicht einfach durch order by Klausel neu anordnen?

+0

Nein, aufgrund der Geschäftsregeln kann ich andere Spalten nicht aktualisieren. Update sollte nur in Sequenzspalte sein. Wir haben Drag & Drop-Funktionen in der Benutzeroberfläche, wenn wir C2 ziehen und die C1-Position einfügen, dann sollte die C2-Sequenz aktualisiert werden und die Benutzeroberfläche wird angezeigt –