Ver Mensaje Individual
  #7 (permalink)  
Antiguo 24/01/2012, 18:06
Avatar de matanga
matanga
 
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años
Puntos: 85
Respuesta: Int o varchar como llave primaria

Cita:
Iniciado por giovani_loera Ver Mensaje
Muchas Gracias a Todos.
Me ayudaron mucho, voy a tomar tu ejemplo Andres95 , pero es vez que se incremental are un store procedure donde adentro haga el insert pero antes de consultar el ultimo id de la tabla y sumarle +1.
Entre las diferentes formas que hay para calcular un ID, el select max() puede que sea la peor, considera dos ejemplos:

Código:
declare @newId int
select @newId=isnull(max(id),0)+1 from myTabla
insert into myTabla (id) values (@newId)
go
Por un lado, con un lock por defecto, transacciones implícitas y un índice sobre el campo ID, tendrás buen rendimiento, pero no hay garantías de que funcione, ya que en entornos de alta concurrencia o tablas de gran tamaño, se podría generar el mismo valor de @newId para dos consultas ejecutadas al mismo tiempo.

Código:
declare @newId int
begin transaction
select @newId=isnull(max(id),0)+1 from myTabla with (tablock)
insert into myTabla (id) values (@newId)
commit transaction
go
Por otro lado, con un lock tipo tabla y transacciones explícitas evitas que se genere un valor duplicado para @newId, ya que en caso de dos consultas al mismo tiempo, una se ejecuta y la otra queda en espera, pero esto puede provocar bajo rendimiento en entornos de alta concurrencia.

Si el campo ID va a ser una PK sustituta tipo INT te recomiendo que utilices identity.

Saludos