2010-08-06 5 views
18

En SQL Server 2008 y superior ¿cuál es la mejor manera/seguro/más correctaforma más segura de acceder al último ID de registro de una tabla

  1. para recuperar el ID (basado en autoincremental clave principal) de la base de datos ¿mesa?
  2. para recuperar el valor de la última fila de alguna otra columna (como, SELECCIONAR ARRIBA 1 DE LA PÁGINA ORDER BY DESC)?
+0

Una pequeña complicación es si desea que se emita la última ID que todavía está en la base de datos, o la última ID emitida: el registro podría haberse agregado y eliminado. En cuyo caso, al usar un máximo/superior, etc., no obtendremos esa identificación. – Andrew

Respuesta

15

La forma más segura será generar o devolver el scope_identity() dentro del procedimiento que inserta la fila, y luego recuperar la fila en función de esa ID. El uso de @@ Identity debe evitarse ya que puede obtener la identificación incorrecta cuando los disparadores están en juego.

Cualquier técnica para solicitar el valor máximo/top 1 sufre una condición de carrera en la que 2 personas agregando al mismo tiempo, obtendrían la misma ID cuando buscaran la ID más alta.

+1

Leí este artículo http://msdn.microsoft.com/en-us/library/ms190315.aspx about @@ identity and scope_identity y parece que tu respuesta es la más adecuada. Tengo dos preguntas adicionales antes de aceptar la respuesta: si no hay ninguna inserción antes y solicitamos scope_identity(), ¿devolverá algo?Y otra, si tuviera que crear claves comerciales en mi aplicación y luego almacenarlas en la tabla, y quiero que deriven de la identidad, ¿está bien consultar por scope_identity()? – mare

+0

Si no puede insertar nada scope_identity() devolverá nulo; una vez que haya devuelto scope_identity() y tenga el campo de identidad, puede usarlo en las consultas para regresar a esa fila para los fines que usted decida. – Andrew

2

una forma más -

select * from <table> where id=(select max(id) from <table>) 

También se puede comprobar en este enlace -

http://msdn.microsoft.com/en-us/library/ms175098.aspx

+0

eso es una manera más, pero no estoy seguro de si no sufre de los mismos problemas posibles que SELECT TOP ... lo hace. Sería bueno que alguien con conocimientos profundos de SQL comentara sobre ambas soluciones qué tan confiables son en escenarios de alto volumen de uso. – mare

4
1. SELECT MAX(Id) FROM Table 
+1

¡Gracias! mejor, solo uno :) – KingRider

1

Y si te refieres a seleccionar el ID del último registro insertado, es

13
SELECT IDENT_CURRENT('Table') 

Puede uno de este examole:

SELECT * FROM Table 
WHERE ID = (
    SELECT IDENT_CURRENT('Table')) 

SELECT * FROM Table 
WHERE ID = (
    SELECT MAX(ID) FROM Table) 

SELECT TOP 1 * FROM Table 
ORDER BY ID DESC 

Pero el primero de ellos será más eficiente porque no se necesita ningún recorrido de índice (si tiene índice de la columna Id).

La segunda solución es equivalente a la tercera (ambos necesitan escanear la tabla para obtener el id. Máximo).

+0

el segundo es incorrecto, si se eliminan las filas darán una respuesta incorrecta. –

2

creo que éste también funcionará:

SELECT * FROM ORDER BY ID DESC LIMIT 0, 1

3
SELECT id FROM Table WHERE id = (SELECT MAX(id) FROM Table) 

Aquí la tabla significa que su nombre de la tabla de base de datos y la identificación significa su mesa nombre del campo.

+3

¡Bienvenido a Stack Overflow! Esta pregunta ya tiene una respuesta aceptada y además tiene 4 años. En este caso, no hay una respuesta adicional antes. –

+2

@j_s_stack, él dio una mejor respuesta, entonces ¿por qué opina eso? – partho

+0

Esto es solo una respuesta de copiar y pegar. Por favor quítalo. –

Cuestiones relacionadas