2016-11-23 2 views
0

Ich habe eine riesige Tabelle mit Millionen und Millionen von Zeilen.Oracle PL/SQL Update doppelte und null Zeilen mit zufälligen sys_guid() und Primärschlüssel hinzufügen

Es hat eine GUID RAW (16 Byte) Spalte. Aus irgendeinem Grund/Aufsicht hatte diese Tabelle nie eine primäre Schlüsseleinschränkung und aufgrund eines Fehlers im Code hatte Duplikate in die GUID-Spalte (sowie einige Null-Werte)

Was ich tun möchte, ist:

  • Aktualisieren Sie alle Zeilen, in denen GUID mit einem zufällig generierte GUID NULL ist (unter Verwendung von SYS_GUID() wahrscheinlich)
  • Aktualisieren, um alle Zeilen, in denen GUID ist ein Duplikat mit einem zufällig generierte guid
  • einen Primärschlüssel In der Tabelle , unter Verwendung der GUID-Spalte.

Die GUID-Werte müssen nicht beibehalten werden, sie müssen alle eindeutig sein. Aber der fragliche Tisch hat etwa 300 Millionen Datensätze, also suche ich nach einem Weg, der nicht zu viel Ausfallzeit bedeutet.

Dank

+0

Was ist ein Duplikat? Wir müssen wissen, welcher Datensatz das "Original" ist, so dass es nicht ersetzt werden sollte. Bitte Tabellenstruktur einfügen. –

+0

Es gibt keine doppelten Zeilen, nur der GUID-Wert wird dupliziert. So haben einige völlig unterschiedliche Aufzeichnungen die gleiche Guid. – bbedward

+0

Sie haben 3 GUIDs, die gleich sind. Woher wissen wir, welcher zu ändern ist, oder sollten alle 3 geändert werden? Kannst du die Tabellenstruktur posten? –

Antwort

1

ich einen Merge-Anweisung, etwas entlang der Linien von verwenden würde:

merge into your_table tgt 
    using (select guid, 
       row_id 
     from (select guid, 
         rowid row_id, 
         row_number() over (partition by guid order by rowid) rn 
       from your_table) 
     where rn != 1) src 
    on (tgt.rowid = src.rowid) 
when matched then 
update set guid = null; 

Fügen Sie einen eindeutigen Index, tun dann ein Update:

update your_table 
set guid = sys_guid() 
where guid is null; 

Dann wird Ihr ändern GUID-Spalte nicht NULL-zulässig und schließlich die Primärschlüsseleinschränkung hinzufügen.

Alternativ können Sie die Aktualisierung der Null- und Duplikat-GUID-Zeilen in der Zusammenführung zu sys_guid() durchführen, aber Sie laufen Gefahr, dass eine doppelte GUID erstellt wird. Das letzte Update kann jedoch weiterhin fehlschlagen, da sys_guid() nicht unbedingt einen eindeutigen Wert generiert.

Persönlich würde ich die GUID verschrotten (obwohl mir klar ist, dass dies nicht immer möglich ist) und mit einer Sequenz gehen; das ist viel einfacher, Einzigartigkeit zu garantieren!

+0

Danke, das schien den Trick zu machen. Die Guid ist in meiner Situation leider nicht möglich. – bbedward

Verwandte Themen