SQL Unterschiedliche UUID für jede existierende Zeile erstellen

Thaxll'ssillyia

Captain
Registriert
Dez. 2007
Beiträge
3.571
Hallo CB-Community,

ich habe derzeit eine Sqlite-Tabelle mit etwa 90.000 Einträgen von mir, die ich um eine Spalte BusinessId erweitern will. Diese ist eine UUID und soll für jeden existerenden Eintrag unterschiedlich sein. Meine ersten Versuche waren die:

Code:
   UPDATE tblX SET BusinessId = (select hex( randomblob(4)) || '-' || hex( randomblob(2))
             || '-' || '4' || substr( hex( randomblob(2)), 2) || '-'
             || substr('AB89', 1 + (abs(random()) % 4) , 1)  ||
             substr(hex(randomblob(2)), 2) || '-' || hex(randomblob(6)) );

Leider erzeugt er mir für jede Zeile die selbe Id. Was müsste ich ändern, damit jeweils eine unterschiedliche UUID generiert wird? Vielleicht ist die Lösung ganz einfach und ich stehe nur auf dem Schlauch, Danke trotzdem für jede Hilfe :)

VG, Thax
 
Naja, du erzeugst ja auch nur EINE einzige Nummer. Die ist dann natürlich immer gleich ;)
 
Da Sqlite keine Funktionen unterstützt würde ich versuchen den Primärschlüssel einer jeden Zeile an die UUID anzuhängen und in einem Statement auch wieder zu entfernen bzw. nur die UUID wieder zu nutzen. Dadurch muss für jede Zeile alles neu berechnet werden. Nicht unbedingt das sauberste, aber für eine einmalige Aktion zu gebrauchen.

Code:
select
	substr(hex( randomblob(4)) || '-' || hex( randomblob(2)) || '-' || '4' || substr( hex( randomblob(2)), 2) || '-' || substr('AB89', 1 + (abs(random()) % 4) , 1)  || substr(hex(randomblob(2)), 2) || '-' || hex(randomblob(6))
		|| primaryKey, lengthOfUuuid)

EDIT: Funktioniert auch gar nicht, Lösung weiter unten bei Post #7.
 
Zuletzt bearbeitet:
Mhh, den Primärschlüssel kann ich da nicht dranhängen. Mein Programm, welches die DB benutzt, verlangt schon die GUID, was auch ziemlich tief verwurzelt ist. Die DB ist hier etwas älter. Gibt es da gar keine Lösung? Eventuell mit irgendeinem Insert-Trigger, bei dem ich alle auslese und mit dem selben Primärschlüsel wieder eintrage?
 
ich würd mir ein kleines Python script schreiben, dass in einer For-each schleife einfach alle Zeilen abarbeitet
 
Hier ein funktionsfähiges Skript, welches für jede Zeile eine neue UUID generiert OHNE dass der Primärschlüssel irgendwo angehangen wird:

Code:
UPDATE Test SET BusinessId = (SELECT hex( randomblob(4)) || '-' || hex( randomblob(2)) || '-' || '4' || substr( hex( randomblob(2)), 2) || '-' || substr('AB89', 1 + (abs(random()) % 4) , 1)  || substr(hex(randomblob(2)), 2) || '-' || hex(randomblob(6)) FROM Test AS t WHERE t.primaryKey = Test.primaryKey);

Der Trick ist hierbei, dass man den HexCode aus der Zeile holt, wo der Primärschlüssel des Selects gleich dem Primärschlüssel des Updates ist. Somit wird dieser immer neu generiert.
 
Zuletzt bearbeitet:
Zurück
Oben