Können Sie Zugriff auf die auto-Inkrement-Wert in MySQL innerhalb einer Anweisung?
Ich habe eine MySQL-Datenbank enthält eine Tabelle der Benutzer. Der primary-key der Tabelle 'userid', die ein auto-Inkrement-Feld.
Was ich tun möchte, wenn ich legen Sie einen neuen Benutzer in die Tabelle den gleichen Wert, die auto-Inkrement ist die Schaffung der 'userid' - Feld in ein anderes Feld, 'default_assignment'.
z.B.
Möchte ich eine Aussage wie diese:
INSERT INTO users ('username','default_assignment') VALUES ('barry', value_of_auto_increment_field())
also ich erstelle user 'Barry', 'userid' generiert als 16 (zum Beispiel), aber ich möchte auch die "default_assignment' haben den gleichen Wert von 16.
Gibt es eine Möglichkeit, dies zu erreichen bitte?
Dank!
Update:
Danke für die Antworten. Die default_assignment Feld ist nicht redundant. Die default_assigment verweisen können alle Benutzer in der Benutzer-Tabelle. Beim anlegen eines Benutzers ich habe bereits ein Formular, das ermöglicht die Auswahl eines anderen Benutzers als der default_assignment, allerdings gibt es Fälle, in denen es gesetzt werden muss, um den gleichen Benutzer, daher meine Frage.
Update:
Ok, ich habe versucht die update-Trigger Vorschlag, aber immer noch kann nicht ankommen dieses zu wirken. Hier ist der Auslöser die ich angelegt habe:
CREATE TRIGGER default_assignment_self BEFORE INSERT ON `users`
FOR EACH ROW BEGIN
SET NEW.default_assignment = NEW.userid;
END;
Beim einfügen eines neuen Benutzers jedoch die default_assignment ist immer auf 0 gesetzt.
Wenn ich manuell die userid dann die default_assignment nicht eingestellt dass die Benutzer-id.
Daher die automatische Zuordnung generation-Prozess deutlich passiert, nachdem der Auslöser wirksam wird.
InformationsquelleAutor der Frage TheKeys | 2009-01-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
es gibt keine Notwendigkeit, erstellen Sie eine andere Tabelle, und max() wird Probleme haben, entsprechend der auto_increment Wert der Tabelle, dies zu tun:
Ich erkläre die next_id variable, weil in der Regel wird es verwendet werden, auf andere Weise(*), aber Sie tun konnte gerade neu.Feld=(select ...)
InformationsquelleAutor der Antwort Resegue
versuchen, diese
InformationsquelleAutor der Antwort Navrattan Yadav
sehen, dass
last_insert_id()
würde nicht funktionieren, in diesem Fall, ja, der Auslöser wäre der einzige Weg, um zu erreichen, dass.Ich Frage mich allerdings: Was brauchst du diese Funktion? Warum speichern Sie die Benutzer-id zweimal? Persönlich, ich weiß nicht, wie die Speicherung redundanter Daten, wie dieses, und ich würde wahrscheinlich lösen diese in Anwendungs-code, indem Sie das ominöse
default_assignment
Spalte NULL und die Verwendung der Benutzer-id in meiner Anwendung code, wenndefault_assignment
war NULL.InformationsquelleAutor der Antwort pilif
Eigentlich habe ich nur versucht, das gleiche zu tun, wie oben vorgeschlagen. Aber es scheint Mysql doesent generieren die eingefügte ID, bevor die Zeile wird tatsächlich engagiert. So NEU ist.userid wird immer 0 zurück, in einem Before insert-trigger.
Oben auch nicht funktionieren, es sei denn, es ist ein BEFORE-INSERT-trigger, da Sie nicht aktualisieren von Werten in einer NACH INSERT-Abfrage.
Aus einer Mysql-Forum Posten, Es scheint der einzige Weg um dies zu umgehen, ist die Verwendung einer zusätzlichen Tabelle als Sequenz. So, dass Ihre trigger ziehen kann, in der Werte aus einer externen Quelle.
Dieser wurde kopiert von forums.mysql.com/read.php?99,186171,186241#msg-186241 aber ich bin nicht erlaubt zu posten links.
InformationsquelleAutor der Antwort Sias Mey
Den ich nur gefunden, dass dieses problem lösen würde, ohne eine zusätzliche Tabelle wäre zu berechnen, selbst die nächste Nummer ein und legte es in die erforderlichen Felder ein.
InformationsquelleAutor der Antwort
grundsätzlich, die Lösung ist wie Resegue sagte.
Aber wenn Sie wollen, dass es in einer Anweisung verwenden Sie eine der folgenden weisen:
1. Eine lange Erklärung:
oder für text, der mit der Nummer:
sieht es deutlicher in PHP:
2. Mit der Funktion: (noch nicht getestet)
InformationsquelleAutor der Antwort Dani-Br
InformationsquelleAutor der Antwort George
Du tun können diese zuverlässig mit einer einfachen Unterabfrage:
InformationsquelleAutor der Antwort cronoklee
Getestet habe ich die vor-trigger-Idee mit 10 gleichzeitigen threads eingefügt und ich habe über 1000 Fälle von 2 oder 3 Duplikate nach ~25k eingefügt.
Habe ich 10:
Und lief die letzten Abfrage zu sehen, die Duplikate
Beispiel für die Ausgabe:
'3', '4217'
'3', '13491'
'2', '10037'
'2', '14658'
'2', '5080'
'2', '14201'
...
Hinweis 'LOCK IN SHARE MODE" nicht etwas ändern. Mit und ohne gab Duplikate bei etwa der gleichen rate. Es scheint, dass die MySQL-AUTO_INCREMENT funktioniert nicht wie Postgres' next_val() und NICHT die Parallelität sicher.
InformationsquelleAutor der Antwort jeffbuhrt
Ich weiß, dieser post ist von 2010, aber ich konnte nicht finden eine gute Lösung.
Ich habe das Problem gelöst, indem eine separate Tabelle, die über den Zähler. Wenn ich brauche zu generieren, die eine eindeutige Kennung für eine Spalte, die ich nur ein Aufruf einer Stored proc:
Den 'update' - Anweisung sperrt die Zeile, in der Zähler-Tabelle. Dies vermeidet Dubletten, die von mehreren threads.
InformationsquelleAutor der Antwort Vinzz