Ich habe versucht, einen Weg zu insert
Informationen in mehreren Tabellen in derselben Abfrage zu finden, aber herausgefunden, dass dies unmöglich ist. Ich möchte insert
es also einfach mit mehreren Abfragen tun, z.
INSERT INTO users (username, password) VALUES('test', 'test')
INSERT INTO profiles (userid, bio, homepage) VALUES('[id of the user here?]','Hello world!', 'http://www.stackoverflow.com')
Aber wie kann ich das automatische Inkrementieren id
von users
zum "Handbuch" userid
für die profile
Tabelle geben?
Antworten:
Nein, Sie können nicht mit einem MySQL-Befehl in mehrere Tabellen einfügen. Sie können jedoch Transaktionen verwenden.
Schauen Sie sich an
LAST_INSERT_ID()
, um Autoincrement-Werte wiederzuverwenden.Bearbeiten: Sie sagten: " Nach all der Zeit, in der Sie versucht haben, es herauszufinden, funktioniert es immer noch nicht. Kann ich die einfach generierte ID nicht einfach in eine $ var und diese $ var in alle MySQL-Befehle einfügen? "
Lassen Sie mich näher darauf eingehen: Hier gibt es drei Möglichkeiten:
In dem Code, den Sie oben sehen. Dies macht alles in MySQL, und die
LAST_INSERT_ID()
in der zweiten Anweisung ist automatisch der Wert der Autoincrement-Spalte, die in die erste Anweisung eingefügt wurde.Wenn die zweite Anweisung selbst Zeilen in eine Tabelle mit einer Spalte für die automatische Inkrementierung einfügt,
LAST_INSERT_ID()
wird diese leider auf die von Tabelle 2 und nicht auf Tabelle 1 aktualisiert. Wenn Sie die von Tabelle 1 danach noch benötigen, müssen wir sie speichern in einer Variablen. Dies führt uns zu den Wegen 2 und 3:Wird das
LAST_INSERT_ID()
in einer MySQL-Variablen speichern:Wird die
LAST_INSERT_ID()
in einer PHP-Variablen (oder einer beliebigen Sprache, die eine Verbindung zu einer Datenbank Ihrer Wahl herstellen kann) auf Lager haben :INSERT ...
LAST_INSERT_ID()
, indem Sie entweder diese Literalanweisung in MySQL ausführen oder beispielsweise PHPs verwenden,mysql_insert_id()
die dies für Sie tunINSERT [use your php variable here]
WARNUNG
Unabhängig davon, wie Sie dieses Problem lösen möchten, müssen Sie entscheiden, was passieren soll, wenn die Ausführung zwischen Abfragen unterbrochen wird (z. B. wenn Ihr Datenbankserver abstürzt). Wenn Sie mit "einige sind fertig, andere nicht" leben können, lesen Sie nicht weiter.
Wenn Sie jedoch entscheiden, dass "entweder alle Abfragen beendet werden oder keine abgeschlossen werden - ich möchte keine Zeilen in einigen Tabellen, aber keine übereinstimmenden Zeilen in anderen, ich möchte immer, dass meine Datenbanktabellen konsistent sind", müssen Sie alle Anweisungen in eine Transaktion einschließen. Deshalb habe ich das
BEGIN
undCOMMIT
hier benutzt.Nochmals kommentieren, wenn Sie weitere Informationen benötigen :)
quelle
@mysql_variables
in Verbindung mit vorbereiteten Anweisungen?ziemlich einfach, wenn Sie gespeicherte Prozeduren verwenden:
vollständiges Skript:
quelle
Was würde passieren, wenn Sie viele solcher Datensätze erstellen möchten (um 10 Benutzer zu registrieren, nicht nur einen)? Ich finde die folgende Lösung (nur 5 Abfragen):
Schritt I: Erstellen Sie eine temporäre Tabelle zum Speichern neuer Daten.
Füllen Sie als Nächstes diese Tabelle mit Werten.
Hier platzieren Sie anstelle
$ALL_VAL
Ihrer Werte eine Werteliste: ('test1', 'test1', 'bio1', 'home1'), ..., ('testn', 'testn', 'bion', 'homen')Schritt II: Senden Sie Daten an die 'Benutzer'-Tabelle.
Hier kann "IGNORE" verwendet werden, wenn Sie zulassen, dass sich einige Benutzer bereits im Inneren befinden. Optional können Sie UPDATE ähnlich wie in Schritt III vor diesem Schritt verwenden, um herauszufinden, wer sich bereits im Benutzer befindet (und sie in der tmp-Tabelle markieren). Hier nehmen wir an, dass der Benutzername wie
PRIMARY
in der Benutzertabelle deklariert ist .Schritt III: Wenden Sie das Update an, um alle Benutzer-IDs von Benutzern in die tmp-Tabelle zu lesen. Dies ist ein wesentlicher Schritt.
Schritt IV: Erstellen Sie eine weitere Tabelle unter Verwendung der Lese-ID für Benutzer
quelle
Versuche dies
Referenzen
PHP
MYSQL
quelle
Schauen Sie sich mysql_insert_id () an
hier die Dokumentation: http://in.php.net/manual/en/function.mysql-insert-id.php
quelle
LAST_INSERT_ID()
um nach dem Programmierer zu rufen ?Dies ist die Art und Weise, wie ich es für ein Uni-Projekt gemacht habe, funktioniert gut, wahrscheinlich nicht sicher
}}
quelle
Nur eine Bemerkung zu Ihrem Spruch
Essen Sie alle Ihre Mittagsgerichte gemischt mit Getränken in derselben Schüssel?
Ich nehme an - nein.
Hier gilt das gleiche.
Es gibt Dinge, die wir separat tun.
2 Einfügeabfragen sind 2 Einfügeabfragen. Es ist alles in Ordnung. Daran ist nichts auszusetzen. Keine Notwendigkeit, es in einem zu zerdrücken.
Gleiches gilt für select. Abfrage muss sinnvoll sein und ihren Job machen. Das sind die einzigen Gründe. Anzahl der Abfragen ist nicht.
Die Transaktionen können verwendet werden, aber für eine durchschnittliche Website ist dies keine große Sache. Wenn es einmal im Jahr (wenn überhaupt) passiert ist, dass eine Benutzerregistrierung fehlerhaft ist, können Sie dies zweifellos beheben.
Es gibt Hunderttausende von Websites, auf denen MySQL ohne Transaktionsunterstützungstreiber ausgeführt wird. Haben Sie von schrecklichen Katastrophen gehört, die diese Orte auseinander brechen? Ich auch nicht.
Und mysql_insert_id () hat nichts mit Transaktionen zu tun. Sie können in Ordnung in die Transaktion einbeziehen. es ist nur eine andere Sache. Jemand hat diese Frage aus dem Nichts gestellt.
quelle
That function is the devil of database consistency.
das gemacht hat, nicht Transaktionen. Ich sehe nichts schlechtes in Transaktionen.Für PDO können Sie dies tun
quelle