2009-03-07 2 views
16

Was ist der beste Weg, um die Auto-ID-Wert in der gleichen SQL mit einem SELECT?SQL - INSERT und fangen Sie die ID Auto-Inkrement-Wert

Ein Forum sagte das Hinzufügen dieser "; has Return Scope_Identity()"
am Ende der SQL-Funktion in ASP.

Gibt es einen entsprechenden Weg in PHP?

+0

Diese Frage für alles, was relevant ist, die SQL verwendet, nicht nur PHP. –

Antwort

16

Es hängt von Ihrem Datenbankserver ab. Rufen Sie unter MySQL mysql_insert_id() direkt nach Ihrer Einfügeabfrage auf. Verwenden Sie PostgreSQL, fragen Sie zunächst nach "select nextval(seq)" in der Sequenz und fügen Sie den Schlüssel in Ihre Einfügeabfrage ein.

Die Abfrage nach "select max(id) + 1 from tbl" kann fehlschlagen, wenn eine andere Anfrage gleichzeitig einen Datensatz einfügt.

0

in PHP: mysql_insert_id() http://us3.php.net/mysql_insert_id

oder

Wenn Sie die Nummer von Ihrem mySql wählen Abfrage genterate wollten, könnten Sie diese EDIT:

SELECT LAST_INSERT_ID(`1`) + 1 FROM table 
+0

Die Auswahl der max könnte ein Problem sein, wenn mehrere Prozesse einfügen, könnte es nicht? – schooner

+1

Wenn Sie einen Datensatz einfügen, dann einen Datensatz löschen und diese Abfrage ausführen, erhalten Sie die Identität des gelöschten Datensatzes. Die nächste Einfügung wird diese Identität in keiner mir bekannten Implementierung erhalten. Vermeiden Sie dies um jeden Preis ... – MatBailie

+0

sollten Sie eine Lesesperre auf den Tisch legen, wenn Sie dies sicher haben wollen! selbst dann bin ich mir nicht sicher, ob das DBMS eine gelöschte ID wiederverwenden wird, wenn irgendwo eine Lücke in der Tabelle existiert. –

3

Es hängt von der Datenbank-Engine ab, die Sie verwenden. Einige DBMS, wie zum Beispiel Firebird, haben eine RETURNING-Klausel, die Sie zu Ihrer Abfrage hinzufügen können. Zum Beispiel, wenn Sie eine Tabelle namens TABLE1 mit Autoincrement Spalte mit dem Namen ID haben, können Sie diese verwenden:

insert into TABLE1(columns...) values (values...) returning ID; 

Und es würde die eingesetzte ID wie eine normale select-Anweisung zurück.

0

Seien Sie sehr vorsichtig: Anscheinend wählen Sie Nextval (Seq) nicht in hoher Parallelität arbeiten - einige andere Verbindung kann zwischen dem Zeitpunkt eingefügt, wenn Sie eingefügt und die Zeit, wenn Sie Select Nextval (Seq) aufgerufen. Testen Sie diesen Code immer in Testsystemen mit hoher Gleichzeitigkeit.

+0

Dies ist nicht wichtig, es sei denn, Sie verwenden die ID für die Bestellung, weil Sie das Ergebnis von nextval (Seq), nicht einen anderen Aufruf der Sequenz selbst verwenden. –

2

In Microsoft Transact SQL können Sie @@ IDENTITY verwenden.

z.B.

DECLARE @Table TABLE (col0 INT IDENTITY, col1 VARCHAR(255), col2 VARCHAR(255)) 

INSERT INTO @Table (col1, col2) VALUES ('Hello','World!') 

SELECT @@Identity 

SELECT * FROM @Table 
+1

Verwenden Sie niemals @@ identity, es gibt Ihnen nicht immer den richtigen Identitätswert und kann zu sehr schlechten Datenintegritätsproblemen führen. Verwenden Sie scope_identity() – HLGEM

+0

Nun, @@ Identität ist in Ordnung, solange Sie wissen, was es tut und den Umfang seiner Wirkung. Seien Sie vorsichtig, wenn Sie Trigger für Tabellen haben (ein Einfügen in eine Tabelle mit einer Identitätsspalte in einem Trigger führt dazu, dass @@ identity aktualisiert wird) oder wenn die Tabelle repliziert wird. Ok, es ist wahrscheinlich sicherer scope_identity() zu verwenden :) – Jon

0

In SQL Server ein Insert der Select-Anweisung verwendet, kann eine Ausgang Klausel hat, die den Identitätswert zurück und was auch immer andere Spalten müssen Sie möglicherweise identifizieren, welche Identität zu dem Datensatz geht. Wenn Sie eine values-Klausel verwenden, verwenden Sie unmittelbar nach dem Einfügen select scope_identity().

7

In Postgres der beste Weg ist, wie etwas zu tun:

insert into foos(name) values ('my_foo') returning id;