2011-12-12 48 views
16

Tengo un pequeño problema ingenioso. Digamos, inserté una fila con algunos datos en una tabla donde está presente una clave principal. ¿Cómo se podría "SELECCIONAR" la clave principal de la fila que acaba de insertarse?SQL - Insertar una fila y devolver la clave primaria

Debería haber sido más específico y mencioné que actualmente soy usando SQLite.

+6

¿Qué RBDMS estás usando? –

Respuesta

38

Para MS SQL Server:

SCOPE_IDENTITY() le devolverá el último valor de identidad generado dentro de su alcance actual:

SELECT SCOPE_IDENTITY() AS NewID 
+13

Funciona para SQL Server - ** pero solo ** si tiene una clave principal de tipo 'INT IDENTITY' (o' BIGINT IDENTITY') - cualquier otro tipo de PK (como un GUID o algo más) es ** not * * compatible con 'SCOPE_IDENTITY()' –

+0

Verdadero, buen punto ... Voy a +1 a su respuesta porque tiene esa situación cubierta. –

+0

@marc_s: o numérico (x, 0) también: adivina el tipo de SCOPE_IDENTITY() ... http://msdn.microsoft.com/en-us/library/ms190315.aspx – gbn

22

Para SQL Server 2005 y hasta, e independientemente de lo que escriba su primaria la clave es que siempre puede usar el OUTPUT clause para devolver los valores insertados:

INSERT INTO dbo.YourTable(col1, col2, ...., colN) 
OUTPUT Inserted.PrimaryKey 
VALUES(val1, val2, ....., valN) 
+1

Este es el camino a seguir, ya que funciona en cualquier clave principal. Requiere ejecutar como una consulta escalar en lugar de una ejecución sin consulta, pero eso es trivial. – ChokesMcGee

+1

Buen método, pero debe usar OUTPUT ... INTO ... para enviar a una tabla intermedia si su tabla tiene desencadenantes. – Ian

5

Para MySQL, utilice LAST_INSERT_ID()

http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

También debe ser capaz de iniciar una transacción, insertar la fila y seleccione la fila utilizando algún campo que tiene un valor único que acaba de insertar, como una marca de tiempo o guid. Esto debería funcionar en prácticamente cualquier RDBMS que admita transacciones, siempre que tenga un buen campo único para seleccionar la fila.

4

MS SQL

Puede usar @@ IDENTITY. Después de una instrucción de inserción, puede ejecutar:

select @@identity 

Esto le dará la clave principal del registro que acaba de insertar. Si usted está planeando usarlo más tarde, sugiero guardarla:

set @MyIdentity = @identity 

Si está usando esto en un procedimiento almacenado y desea acceder de nuevo en su aplicación, asegúrese de tener NoCount fuera.

+4

Si tiene una columna 'IDENTIDAD', le recomendaría que use [' SCOPE_IDENTITY() 'en lugar de' @@ IDENTITY'' (http://blog.sqlauthority.com/2007/03/25/sql-server- identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record) –

0

para PostgreSQL:

SELECT CURRVAL(pg_get_serial_sequence('schema.table','id')) 

Fuente: https://stackoverflow.com/questions/2944297/postgresql-function-for-last-inserted-id

+1

PGSQL puede ser mejor, revisa RETURNING. – BastetFurry

+0

Por comentario de BastetFurry, vea la cláusula 'RETURNING' del comando [' INSERT'] (http://www.postgresql.org/docs/current/static/sql-insert.html). Para citar el documento: 'La cláusula RETURNING opcional hace que INSERT calcule y devuelva valor (es) en función de cada fila realmente insertada. Esto es principalmente útil para obtener valores que fueron provistos por valores predeterminados, como un número de secuencia de serie. –

1

Si necesita recuperar el nuevo índice en MS SQL cuando hay factores desencadenantes en la tabla a continuación, usted tiene que utilizar un poco de solución. Una SALIDA simple no funcionará. Usted tiene que hacer algo como esto (en VB.NET):

DECLARE @newKeyTbl TABLE (newKey INT); 
INSERT INTO myDbName(myFieldName) OUTPUT INSERTED.myKeyName INTO @newKeyTbl VALUES('myValue'); " & _ 
SELECT newKey FROM @newKeyTbl;" 

Si se utiliza .NET, entonces el valor de retorno de esta consulta se puede convertir directamente a un número entero (hay que llamar "ExecuteScalar" en el .NET SqlCommand para obtener el retorno).

0
select MAX(id_column) from table 

Que, en teoría, debería devolverle la última identificación insertada. Si se trata de una base de datos ocupada con muchas inserciones, puede que no obtenga la que acaba de hacer, sino otra.

De todos modos, una alternativa a otros métodos.

Cuestiones relacionadas