Ich habe gerade eine Reihe von Daten in eine MySQL-Tabelle importiert und ich habe eine Spalte "GUID", die ich grundsätzlich alle vorhandenen Zeilen mit neuen und eindeutigen zufälligen GUIDs füllen möchte.
Wie mache ich das in MySQL?
Ich habe es versucht
UPDATE db.tablename
SET columnID = UUID()
where columnID is not null
Und einfach jedes Feld gleich bekommen
Antworten:
Ich bin mir nicht sicher, ob es der einfachste Weg ist, aber es funktioniert. Die Idee ist, einen Trigger zu erstellen, der alles für Sie erledigt, dann eine Abfrage auszuführen, die Ihre Tabelle aktualisiert, und diesen Trigger schließlich zu löschen:
Dann ausführen
Und
DROP TRIGGER beforeYourTableUpdate
;UPDATE Eine andere Lösung, die keine Trigger verwendet, aber einen Primärschlüssel oder einen eindeutigen Index erfordert:
UPDATE noch einmal: Es scheint, dass Ihre ursprüngliche Abfrage auch funktionieren sollte (vielleicht brauchen Sie sie nicht
WHERE columnID is not null
, also wird mein ganzer ausgefallener Code nicht benötigt.quelle
UUID
es richtig implementiert ist (und ich glaube es ist), sollten Sie in der Lage sein, einen eindeutigen Index zu erstellen, ohne nach Duplikaten zu suchen.Ich musste einer vorhandenen Tabelle eine Guid-Primärschlüsselspalte hinzufügen und diese mit eindeutigen GUIDs füllen, und diese Aktualisierungsabfrage mit innerer Auswahl funktionierte für mich:
So einfach :-)
quelle
UUID
basierend auf der Maschine und dem Zeitstempel generiert wird . Als Abfrage, deren Ausführung Millisekunden dauert, müssen sie zwar sehr, sehr nahe beieinander liegen ... aber niemals gleich ... eine gute Sache, um Ihnen zu versichern, ist das Hinzufügen einesUNIQUE
Index zu dieser Spalte.UPDATE sri_issued_quiz SET quiz_id=uuid();
Die genehmigte Lösung erstellt zwar eindeutige IDs, sieht jedoch auf den ersten Blick identisch aus, nur die ersten Zeichen unterscheiden sich.
Wenn Sie sichtbar unterschiedliche Schlüssel wünschen, versuchen Sie Folgendes:
Ich verwende MySQL Server Version: 5.5.40-0 + wheezy1 (Debian)
quelle
SELECT INSERT(INSERT(INSERT(INSERT(MD5(UUID()), 9, 0, '-'), 14, 0, '-'), 19, 0, '-'), 24, 0, '-')
Query ist nicht sehr hübsch, aber es macht den Job.quelle
Nur eine kleine Ergänzung, da ich beim Versuch, die UUIDs so zu ändern, wie sie generiert wurden, ein seltsames Ergebnis erzielt habe. Ich fand die Antwort von Rakesh die einfachste, die gut funktionierte, außer in Fällen, in denen Sie die Striche entfernen möchten.
Als Referenz:
Dies funktionierte perfekt für sich. Aber als ich das versuchte:
Dann waren alle resultierenden Werte gleich (nicht subtil unterschiedlich - ich vervierfachte mit einer
GROUP BY some_field
Abfrage). Egal wie ich die Klammern angeordnet habe, das gleiche passiert.Es scheint, dass beim Umgeben der Unterabfrage zum Generieren einer UUID mit REPLACE die UUID-Abfrage nur einmal ausgeführt wird, was als Optimierung für viel intelligentere Entwickler als ich wahrscheinlich durchaus sinnvoll ist, für mich jedoch nicht.
Um dies zu beheben, habe ich es einfach in zwei Abfragen aufgeteilt:
Natürlich eine einfache Lösung, aber hoffentlich spart dies jemandem die Zeit, die ich gerade verloren habe.
quelle
Sieht aus wie ein einfacher Tippfehler. Hast du nicht , dass „... wo columnid ist null“?
quelle
WHERE
Klausel geben. Und die generierten Werte sind sehr ähnlich, daher müssen Sie sie genau betrachten, um festzustellen, dass sie tatsächlich unterschiedlich sind.Ich hatte meistens das gleiche Problem. Im my case uuid wird als BINARY (16) gespeichert und hat KEINE NULL UNIQUE-Einschränkungen. Und ich war mit dem Problem konfrontiert, als für jede Zeile dieselbe UUID generiert wurde und die UNIQUE-Einschränkung dies nicht zulässt. Diese Abfrage funktioniert also nicht:
UNHEX(REPLACE(uuid(), '-', ''))
Aber für mich hat es funktioniert, als ich eine solche Abfrage mit verschachtelter innerer Auswahl verwendet habe:
UNHEX(REPLACE((SELECT uuid()), '-', ''))
Dann wird für jeden Eintrag ein eindeutiges Ergebnis erstellt.
quelle
quelle
MYsql UPDATE Tabellenname SET columnName = UUID ()
oracle UPDATE Tabellenname SET columnName = SYS_GUID ();
SQLSERVER UPDATE Tabellenname SET columnName = NEWID () ;;
quelle
quelle