2009-03-07 10 views
16

¿Cuál es la mejor manera de obtener el valor de identificación automática en el mismo SQL con un SELECCIONAR?SQL - INSERTAR y capturar el valor de incremento automático de ID

Un foro dijo agregando esto "; has Return Scope_Identity()"
al final del SQL funciona en ASP.

¿Hay una forma correspondiente en PHP?

+0

Esta pregunta es relevante para cualquier cosa que utiliza SQL, no sólo PHP. –

Respuesta

16

Depende de tu servidor de base de datos. Usando MySQL, llame al mysql_insert_id() inmediatamente después de su consulta de inserción. Usando PostgreSQL, primero consulta "select nextval(seq)" en la secuencia e incluye la clave en tu consulta de inserción.

La consulta de "select max(id) + 1 from tbl" podría fallar si otra solicitud inserta una grabación simultáneamente.

0

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

o

Si quería genterate el número de su mySql consulta de selección, podría utilizar este EDIT:

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

Seleccionar el máximo podría ser un problema si varios procesos están haciendo inserciones ¿no es así? – schooner

+1

si inserta un registro, luego elimina un registro, luego ejecuta esta consulta obtendrá la identidad del registro eliminado. el siguiente inserto no obtendrá esa identidad en ninguna implementación de la que tenga conocimiento. Evita esto a toda costa ... – MatBailie

+0

¡debes poner un bloqueo de lectura en la mesa si quieres que esto sea seguro! incluso entonces, no estoy seguro de que el DBMS no reutilice alguna identificación eliminada si existe un espacio en la tabla en alguna parte. –

3

Depende del motor de base de datos que está utilizando. Algunos DBMS, como Firebird, por ejemplo, tienen una cláusula de RETORNO que puede agregar a su consulta. Por ejemplo, si tiene una tabla denominada Tabla1 con columna de incremento automático llamado ID, puede utilizar esto:

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

y sería devolver el ID insertado al igual que una instrucción de selección regular.

0

Tenga mucho cuidado: al parecer, select nextval (seq) no funciona en alta concurrencia, alguna otra conexión puede insertarse entre el momento en que insertó y la hora a la que llamó select nextval (seq). Siempre pruebe dicho código en arneses de prueba de concurrencia alta.

+0

Esto no importa a menos que esté usando la ID para ordenar, porque está usando el resultado de nextval (seq), no otra llamada a la secuencia misma. –

2

En Microsoft Transact SQL puede usar @@ IDENTIDAD.

p. Ej.

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

nunca use @@ identity, no siempre le dará el valor de identidad correcto y puede causar problemas de integridad de datos muy malos. Use scope_identity() – HLGEM

+0

Bueno, @@ identity está bien siempre que sepa lo que hace y el alcance de su efecto. Solo tenga cuidado si tiene factores desencadenantes en las tablas (una inserción en una tabla con una columna de identidad en un desencadenador hará que se actualice @@ identity) o si la tabla se replica. Ok, probablemente sea más seguro usar scope_identity() :) – Jon

0

En SQL Server utilizando un inserto de la instrucción de selección puede tener una cláusula de salida que devolverá el valor de identidad y cualquier otro columnas que pueda necesitar para identificar qué identidad va a qué registro. Si está utilizando una cláusula de valores, utilice select scope_identity() inmediatamente después de la inserción.

7

en Postgres la mejor manera es hacer algo como:

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