14 Stimmen

Holen Sie sich alle eingefügten IDs beim Einfügen mehrerer Zeilen mit einer einzelnen Abfrage

Ich habe bereits andere Antworten angesehen und fühle immer noch, dass meine Frage relevant ist und einen separaten Eintrag verdient.

Ich habe eine Tabelle namens Einstellungen (in der Benutzereinstellungen gespeichert sind) und ich muss mehrere Einstellungen für jeden Benutzer einfügen. Zunächst hatte ich für jede Einstellung eine separate Einfügeanweisung ausgeführt, aber nachdem ich das nicht als besonders gute Methode empfunden hatte, dachte ich daran, mehrere Zeilen mit derselben Einfügeanweisung einzufügen. Mein einziges Problem ist, dass ich die auto_incremented IDs jeder der neu eingefügten Zeilen haben möchte.

Ich habe Antworten gelesen, die sagen, dass dies nicht möglich/skalierbar usw. ist, aber ich denke, dass ich die Lösung gefunden habe. Ich möchte Feedback, ob mein Weg richtig ist oder nicht, und deshalb diese Frage.

Was ich gemacht habe, ist einfach. Nach dem Einfügen der mehreren Zeilen rufe ich last_insert_id() auf, um die ID der ersten Zeile der gleichzeitig eingefügten Zeilen zu erhalten. Ich habe bereits die Anzahl der eingefügten Zeilen, also erstelle ich einfach ein neues Array und fülle es mit IDs, die bei last_insert_id() beginnen und bei last_insert_id()+n-1 enden (wobei n die Anzahl der eingefügten Zeilen ist).

Ich denke, dass dies funktionieren wird, aus folgenden Gründen:

1.) Die MYSQL-Dokumentation besagt, dass last_insert_id() von der Verbindung abhängig ist und wenn ein anderer Client/ eine andere Verbindung neue Datensätze einfügt, hat dies keinen Einfluss auf das last_insert_id() des anderen Clients.

2.) Ich denke, dass, da der Einfügevorgang durch eine einzelne SQL-Anweisung durchgeführt wird, die gesamte Einfügung als einzelne Transaktion behandelt werden sollte. Wenn das zutrifft, sollten ACID-Regeln gelten und die auto_incremented Werte sequenziell sein. Ich bin mir bei diesem Punkt nicht sicher.

Das sind meine Gründe, warum ich denke, dass die Logik funktionieren sollte. Also lautet meine Frage: Wird die obige Logik unter ALLEN Bedingungen funktionieren? Kann ich darauf vertrauen, dass sie in allen Situationen korrekt funktioniert? Ich weiß, dass es derzeit für mich funktioniert.

0voto

Ich habe das eine Weile lang gemacht, fand die Daten am Ende jedoch nicht nützlich, also habe ich aufgehört.

Ich verfolge das Datum und den Benutzer, der jede Eintragung in die Tabelle geändert hat, um die Liste problemlos abrufen zu können.

Es ist jedoch wichtig, eine Variable mit der Zeit zu setzen, anstatt sich auf NOW() zu verlassen:

 INSERT INTO table (username,privelege,whenadded,whoadded) VALUES ('1','2','$thetime','$theinserter'),('1','5','$thetime','$theinserter'),etc...;

werden die mehreren Zeilen schön einfügen.

um das gesuchte Array abzurufen:

SELECT idrow FROM table WHERE username='1' AND whenadded='$thetime' AND whoadded='$theinserter';

Dies ist eine gute Praxis, da Sie verfolgen können, welcher Benutzer den Datensatz geändert hat und es nicht von Sperren oder Zufall abhängt.

Was Ihre eigene Lösung betrifft, wird sie funktionieren und spart eine Abfrage. Ich würde mir jedoch Sorgen machen, wie sie auf vorbereitete Anweisungen in einer stark frequentierten Tabelle reagieren könnte, und vielleicht sollte die verwendete Methode dies in Betracht ziehen. Die Methode, die ich verwende, ist immun gegen solche Probleme.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X