2011-01-10 6 views
2

Ich habe seit einiger Zeit grundlegende MySQL gemacht, aber nichts darüber hinaus. Ich frage mich, ob es eine Möglichkeit gibt, die Reihe zu mir zurückzustecken, oder etwas, wenn ich eine neue Reihe in eine Tabelle einfüge. Grundsätzlich habe ich eine Tabelle mit einem Auto-Nummerierten Feld, und ich möchte in der Lage sein, diese Auto-Nummer so schnell und schmerzlos wie möglich zu bekommen. Wenn ich die Zeile nicht zu mir zurückgeben kann, sollte ich etwas anderes tun, als nur eine zweite Abfrage für das höchste Autonum auszuführen? Würde das nicht die (leichte, sehr, sehr geringfügige) Chance zulassen, dass die Tabelle von einem anderen Prozess oder Benutzer aktualisiert wurde und das nicht mehr die richtige Nummer ist? Momentan suche ich nur nach einer Zeile mit genau den Inhalten, die ich gerade eingegeben habe, und selbst das scheint mir Probleme zu bereiten.Gibt es eine Möglichkeit, MySQL dazu zu bringen, die von einem INSERT-Befehl erzeugte Zeile zurückzugeben?

Ich benutze PHP 5.1 und MySQL 5.0.45 wie es aussieht.

Danke für Ihre Hilfe.

+0

Sie suchen LAST_INSERT_ID suchen() http://dev.mysql.com/doc/refman/5.1/en/information-functions.html#function_last-insert-id –

+4

NB: Wenn Sie‘ Sprechen Sie darüber, dies in PHP zu bekommen, verwenden Sie PHPs mysql_insert_id -Funktion - ** versuchen Sie nicht, eine "LAST_INSERT_ID()" SQL-Abfrage aus PHP ** heraus zu stellen. –

+1

@middaparka: Leute, denen Punkte wichtig sind, werden seine Frage nicht beantworten. Menschen, die eine gute Frage schätzen und sich für Wissen interessieren, kümmern sich nicht um Punkte. –

Antwort

4

Versuchen Sie, diese Funktion: mysql_insert_id

Es die ID in der letzten Abfrage

+1

Beantwortet dies seine zweite Frage: "Würde das nicht die (leichte, sehr, sehr geringfügige) Chance zulassen, dass die Tabelle von einem anderen Prozess oder Benutzer aktualisiert wurde und das nicht mehr die richtige Nummer ist?" –

+1

@aaaa bbbb - Da PHPs mysql_insert_id in derselben Verbindung wie die Abfrage aufgerufen wird, gibt es immer die ID aus dieser Abfrage zurück. Das heißt: Es wird nicht von Aktivitäten anderer Benutzer beeinflusst. –

+0

Danke! Und danke @middaparka. Ich benutze PDO, also sieht es so aus, als müsste ich PDO :: lastInsertId verwenden. Wer weiß, ob mir das irgendwelche anderen Probleme bereiten wird? –

5

erzeugt kehrt könnten Sie LAST_INSERT_ID() verwenden, die Arbeiten im Rahmen der aktuellen Verbindung ist.

Die ID, die generiert wurde, wird pro Verbindung auf dem Server verwaltet. Dies bedeutet, dass der von der Funktion an einen bestimmten Client zurückgegebene Wert der erste AUTO_INCREMENT-Wert ist, der für die letzte Anweisung generiert wurde, die eine AUTO_INCREMENT-Spalte durch diesen Client betrifft. Dieser Wert kann von anderen Clients nicht beeinflusst werden, auch wenn sie eigene AUTO_INCREMENT-Werte generieren. Dieses Verhalten stellt sicher, dass jeder Client seine eigene ID abrufen kann, ohne sich um die Aktivität anderer Clients kümmern zu müssen, und ohne die Notwendigkeit von Sperren oder Transaktionen.

Weitere Informationen here.

+2

Wie antworten Sie auf Middaparkas Kommentar, dass Sie nicht versuchen sollten, eine "LAST_INSERT_ID()" - SQL-Abfrage in PHP auszuführen? Ich denke, ich würde mit der integrierten PHP-Funktion mysql_insert_id gehen. –

+0

Ich würde zustimmen LAST_INSERT_ID() ist nicht dazu gedacht, irgendwo anders als auf der SQL-Ebene in Ihren Skripten verwendet werden. Wenn Sie versuchen, den Wert von PHP zu bekommen, schlage ich vor, middaparkas Rat zu befolgen. –

+0

Danke Sergei! Ich gehe mit der PHP-Version, aber ich weiß es auch zu schätzen. –

0

Um mysql_insert_id zu verwenden, ist es in Ordnung, aber Sie wollen Race Conditions wirklich vermeiden, wählen Sie einfach nach dem Einfügen mit den Werten, die Sie gerade eingefügt haben. Wenn diese Werte nicht eindeutig sein können, fügen Sie auch einen zuvor berechneten Zeitstempel ein. http://www.php.net/manual/en/function.mysql-insert-id.php#95584:

<?php 
$date = date('U'); 
$db->query("INSERT INTO TABLE table VALUES('', 'a', 'b', 'c', 'd', '". $date ."'"); 
$res = $db->query("SELECT id FROM table WHERE a_col = 'a' AND b_col = 'b' AND c_col = 'c' AND d_col = 'd' AND temp_id = '".$date."'"); 
?> 
+2

Es tut nicht weh, mit der Quelle zu verbinden, wo Sie Code kopieren, wissen Sie ... http://www.php.net/manual/en/function.mysql-insert-id.php # 95584 – nickf

+0

Dies ist völlig unnötig. PHP's mysql_insert_id ist verbindungsbasiert und daher wird die vorherige Einfüge-ID intakt bleiben, solange das laufende PHP-Skript keine weitere SQL-Abfrage ausgibt. –

+0

@middaparke: und wenn Sie nicht Auto-Inkrement-Felder verwenden oder Sie mehrere Zeilen mit einem Befehl einfügen? – Sergi

Verwandte Themen