Tengo un poco ingenioso problema. Decir, he insertado una fila con algunos datos en una tabla donde una clave principal está presente. ¿Cómo sería una «SELECCIONAR» la clave principal de la fila uno acaba de insertar?

Debería haber sido más específico y mencionó que actualmente estoy
el uso de SQLite.

  • Que RBDMS estás usando?

8 Comentarios

  1. 50

    Para MS SQL Server:

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

    SELECT SCOPE_IDENTITY() AS NewID
    • Funciona SQL Server – pero sólo si usted tiene una clave primaria de tipo INT IDENTITY (o BIGINT IDENTITY) – cualquier otro tipo de PK (como un GUID o algo más) es no apoyado por SCOPE_IDENTITY()
    • Cierto, buen punto… voy a hacer +1 en tu respuesta causar tienes esa situación cubierta.
    • o numéricos(x,0) demasiado: adivinar el tipo de SCOPE_IDENTITY()… msdn.microsoft.com/en-us/library/ms190315.aspx
    • Gracias un montón. Aunque debería haber sido más específico y mencionó que actualmente estoy usando SQLite. De todos modos, busqué en google hasta «SCOPE_IDENTITY en SQLite» y encontré mi respuesta. Saludos. Este marcado como respuesta.
  2. 33

    Para SQL Server 2005 y hasta, e independientemente de lo que escriba su clave primaria es, siempre se puede usar el SALIDA cláusula para devolver los valores insertados:

    INSERT INTO dbo.YourTable(col1, col2, ...., colN)
    OUTPUT Inserted.PrimaryKey
    VALUES(val1, val2, ....., valN)
    • Este es el camino a seguir, ya que funciona en cualquier clave principal. Se requiere ejecutar como un escalar consulta en lugar de un no-consulta de ejecutar, pero eso es trivial.
    • Buen método, pero usted tiene que utilizar la SALIDA … EN … la salida en una tabla intermedia si la tabla tiene desencadenantes.
    • Esto funciona (¡gracias!) pero tenga en cuenta que PrimaryKey no es una palabra clave (y resultará en Invalid column name 'PrimaryKey'. si tratas de usar. Debe ser reemplazado por su real nombre de la columna.
    • por supuesto, simplemente me escribió PrimaryKey para ilustrar que aquí, lo que la columna se define como clave primaria debe ser utilizado (ya que el OP no mencionar lo de la columna es su clave primaria).
    • Sí, acaba de salir un comentario para cualquier futuro copiar y pegar dunces como yo 🙂
    • Muchas gracias. Se está trabajando para mi final.

  3. 6

    Para MySQL, uso LAST_INSERT_ID()

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

    Usted también debe ser capaz de iniciar una transacción, insertar la fila y seleccione la fila usando algún campo que tiene un valor único que se acaba de insertar, como una marca de tiempo o guid. Esto debería funcionar en casi cualquier motor de base de datos que soporta transacciones, siempre y cuando usted tiene un buen campo único para seleccionar la fila.

  4. 6

    De SQL Server:

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

    select @@identity

    Esto le dará la clave primaria del registro que acaba de insertar. Si usted está planeando utilizar más tarde, me sugieren guardarla:

    set @MyIdentity = @@identity

    Si usted está usando esto en un procedimiento almacenado y desea tener acceso a él de vuelta en su aplicación, asegúrese de tener nocount off.

  5. 2

    Si usted necesita para 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 simple SALIDA no va a funcionar. Tienes 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 va a usar .NET, entonces el valor de retorno de esta consulta se puede lanzar directamente a un número entero (se tiene que llamar «ExecuteScalar» en el .NET SqlCommand para obtener la devolución).

  6. 0

    Para Postgresql:

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

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

    • PGSQL puede hacer mejor, echa un vistazo a DEVOLVER.
    • Por cada comentario por BastetFurry, ver la RETURNING cláusula de INSERT comando. Para citar el doc: The optional RETURNING clause causes INSERT to compute and return value(s) based on each row actually inserted. This is primarily useful for obtaining values that were supplied by defaults, such as a serial sequence number.
  7. 0

    Para SQLite:

    SELECT [Column_1],  [Column_2],...  [Column_n]
    FROM [YourTable]
    WHERE rowid = (SELECT last_insert_rowid())

    mientras que:

    • Column_1, Column_2,… Column_n: son la clave principal de YourTable.

    Si quieres creado YourTable con la clave principal reemplazado rowid (es decir, una columna pk definido como INTEGER PRIMARY KEY) que acaba de uso:

    SELECT last_insert_rowid()

    Que es un caso común.

    Por último, este no trabajo para WITHOUT_ROWID tablas.

    Por Favor Compruebe:

    https://www.sqlite.org/lang_corefunc.html#last_insert_rowid

  8. -2
    select MAX(id_column) from table

    Que, en teoría, debería volver a usted que el último id insertado. Si se trata de una concurrida de la base de datos con muchas inserciones va en ella no puede conseguir el que usted acaba de hacer, pero otra.

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

Dejar respuesta

Please enter your comment!
Please enter your name here