MySQL - Ändern Sie die Tabelle, um automatisch eine UUID einzugeben

14

Ok, ich weiß, dass ich das schon mal gemacht habe. Aber ich kann es nicht für mein Leben herausfinden. Ich habe eine Tabelle erstellt. Eine der Spalten trägt die Bezeichnung "LogID" und ist gleichzeitig der Primärschlüssel.

Wie ändere ich es, damit diese Spalte eine UUID für jeden neuen Eintrag generiert?

Vielen Dank

Matt Winer
quelle

Antworten:

17

Erstellen Sie einfach einen Trigger, der vor dem Einfügen ausgeführt werden soll, um die UUID für die angegebene Spalte zu generieren.

CREATE TRIGGER before_insert_mytable
  BEFORE INSERT ON mytable
  FOR EACH ROW
  SET new.LogID = uuid();
Robert Gabriel
quelle
3

Der Ausdruck UUID () generiert beim Aufruf eine UUID.

Leider (trotzdem AFAIK) erlaubt MySQL keine Ausdrücke als Standardwert für ein Feld. Um dies zu umgehen, könnten Sie das Feld immer auf den Standardwert Null setzen und einen Auslöser haben, der das Feld beim Einfügen mit einer UUID aktualisiert.

ydaetskcoR
quelle
2

Ich bin mir ziemlich sicher, dass Sie das immer noch nicht können. Ich würde ernsthaft in Betracht ziehen, keine UUID als Primärschlüssel zu verwenden, sondern einen schlankeren, schöneren Datentyp wie INT. Sie können Ihre UUID als separate Spalte hinzufügen und über a aktualisieren TRIGGER, falls dies für Sie passt.

Avarkx
quelle
Ganzzahlen werden aufgeschlüsselt, wenn Datensätze in Ihrer Datenbank eindeutig sein müssen.
Cfreak
1
Ich würde vermuten, dass es ein größeres Modelldesign oder ein ausgewähltes Werkzeugproblem gibt, wenn die Anforderungen das Motorlagermuster auf dieser Ebene bestimmen. In diesem Fall ist die UUID als separate Spalte die beste Lösung für beide Welten.
Avarkx
UUID wird aufgebläht, sobald es für Menschen formatiert ist. Wenn Sie eine UUID als Primärschlüssel verwenden möchten, entfernen Sie die Bindestriche und entziffern Sie sie. Wenn Sie die vom Menschen formatierte Version benötigen, können Sie der Tabelle eine generierte Spalte hinzufügen. SELECT LENGTH(UNHEX(REPLACE(UUID(),'-','')))= 16 Bytes binär. Immer noch größer als, INTaber viel besser alsVARCHAR(36)
miknik
Schlechter Rat, Miknik. Ihre Datenbank wird fürchterlich skaliert, wenn Sie eine UUID als Primärschlüssel verwenden. Könnte auch 16 separate Ganzzahlspalten als zusammengesetzten Primärschlüssel haben. Und Indexfragmentierung in Hülle und Fülle! Ihr Primärschlüssel ist jetzt zufällig. Verwenden Sie in diesem Fall keine Fremdschlüssel. Joins ändern sich von O (n) zu O (n ^ 2). Zwei Verknüpfungen von O (n log10 (n)) zu O (n ^ 3). Ersetzen Sie n durch 100.000 und subtrahieren Sie die Differenz.
TamusJRoyce
2

Ich habe gerade beschlossen, den Befehl UUID () in die Einfügung meiner Anwendung aufzunehmen.

Vielen Dank an alle.

Matt Winer
quelle