[Oracle] dynamischen PK_Schlüssel generieren

BLR

Erfahrenes Mitglied
Hallo zusammen,

ich muss einen alphanummerischen Schlüssel generieren, weches PK sein wird.
Natürlich dürfen die anderen dabei nicht überschrieben werden.
Wie auch immer ich das im Code umsetze, würde ich gerne meine Vorgehensweise beurteilen lassen:

1.Jeden bereits vorhandenen Schlüssel Zeichen für Zeichen ins ascii umwandeln.
2.Entstandene nummerische Werte absteigend sortieren.
3.Den Größten Werte selektieren und zu ihm ein zufällig erzeugtes Zeichen zwischen 30 bis 254 hinzufügen.
4.Dann zurück von ascii Zahl für Zahl ins entsprechende Zeichen umschreiben.

Wäre diese Vorgehensweise genauso sicher wie "auto increment" bein nummerischen Werten?
Danke
 
Hi

hab zwar einiges nicht verstanden, aber weißt du, dass ein Schlüssel
aus einigen guten Gründen eine einzelne Zahl sein soll?
 
Ja ich weiss, die Gegebenheiten sind aber so, dass das ein alphanummerischer Wert sein kann wie: "%%2sA*
Noch mal die Erklärung:
1. ich Wandele Zeichen für Zeichen ( also zuerst ", dann %, dann % usw..)in entsprechneder ascii-Wert um
2. Dann habe ich sowas wie: 7688865645 da stehen.
3. Ich sortiere diesen nummerischen Wert nach dem größten.
--Dieser Schritt garantiert mir, dass ich keine Dupplicate später erzeuge
4. Generiere mir eine Zahl, die ein zusätzliches neues Zeichen repräsentiert.
5. Füge es an den erst ausgewählten nummerischen Wert
6. Wandele diesen großen nummerischen Wert je nach einzelner Zahl in ein Zeichensatz um ==> neuer alphanummerischer Wert

Wäre so eine Vorgehensweise absolut sicher vor Duplikaten?
 
Bitte korrigieren, wenn falsch: Es geht um die Vorgehensweise beim Einfügen von einem
neuen Datensatz und den damit verbundenen neuen Schlüssel.

1) Woher kommen diese Zeichen?
Soll der Nutzer selber Keywerte angeben, die nur auf Duplikate geprüft werden?
Oben schreibst du noch, das du den Schlüssel generieren willst.

Was tun Leute, die Buchstaben verwenden, die es im ASCII nicht gibt?

Wenn doch generiert: Warum, und aus welchem Wertebereich?
(zB. sind Zeilenwechsel erlaubt usw.)

2) Warum? "%% ergibt was Anderes.
Soll das Hexadeziaml sein, oder welche Notation sonst?
Wenn Dezimal: Wie unterscheidet man die zwei Buchstaben mit Nummern "111 11" von "11 111"?

3) Was wird sortiert? Die gesamten Zahl "7688865645" pro vorhandenem DB-String-Key,
die einzelnen Ascii-Teile dieser einen Zahl (76 88 ...), die Ziffern dieser einen Zahl (7 6 8 8), oder...?

4) Wie und woraus wird die neue Zahl generiert?
Ausgangsdaten, Wertebereich, ggf. Periode vom PRNG usw.usw.?

5) Wo wurde welcher Wert ausgewählt?
Vorne oder hinten anfügen oder Addieren oder...?

6) Wie wandelt man zB. 7688865645 in Zeichen um, wenn man keine Ahnung hat,
wo die Buchstaben aufhören und anfangen (siehe Punkt 2)

...
Das hört sich für dich vermutlich komplett dumm an,
aber ich kann keine Gedanken lesen.
Das ist alles, was hier absolut sicher ist.
 
Das ist schon in Ordnung, im folgenden gehe ich auf jeden Punkt von dir ein:

1) Der alphanumerischer PK soll von meiner Funktion, die gerade entwickele, generiert werden
2) Das ist kein Hex, sondern einfach normale Char´s.
Deine Frage ist berechtigt wie man zwei gleiche Zeichen nummerisch auseinander halten soll. Das ist eins der Probleme,
die mir auch dabei in den Sinn kommen (Deswegen dieser Thread ob der Ansatz an sich, also vom Punkt 1 bis 6 gut oder schlecht sei)
3) Der gesamter, zusammgengesetzter Int-Wert (setzt sich zusammen aus allen ascii-Werten) wird mit DESC sortiert, also wäre die Zahl "7688865645" ausgewählt.
4) Ich weiss noch nicht genau, wie man das mit PL/SQL umsetzt, aber eine Zahl in einem Wertebereich kann man doch sicher generieren lassen.
5) Mit "ausgewählt" meinte ich, dass ich mit dem Select-Statement und 'Where Rownum=1' den aller ersten nummerischen Wert einfach auswähle um mit ihm weiter zu arbeiten
6) Das ist das größte Problem^^
Ich könnte Rahmenbedienungen schaffen, wo jeweils zwei Stellen einer Zahl betrachtet und interpritiert werden bzw. drei Stellen, aber damit würde ich auch mögliche Kombinationen an Zeichen sehr starkt reduzieren.....vllt. gibts nen besseren Ansatz für diesen Schritt

Wie du siehst, kann ich auch nicht alle Fragen beantworten, deswegen frage ich hier, ob diese Vorgehensweise noch gut ist, oder man sich was anderes überlegen muss.
Danke

NACHTRAG
Ich habe mir überlegt, dass der letzte Schritt mit "Zurückkonvertieren" entfallen kann, denn
wenn ich die zahl 7688865645 um eins erhöhe und speichere, ist es einzigartig und kann als Typ vom "Varchar" gespeichert werden.
 
Zuletzt bearbeitet:
Zurück