Autor Tema: consulta SQL-transac  (Leído 3689 veces)

Desconectado Mithrandir

  • Avanzado
  • ****
  • Mensajes: 1666
consulta SQL-transac
« en: Noviembre 15, 2011, 09:56:54 am »
Estimados necesito saber como generar un id o cod primario automatico en una tabla por ejemplo esta tabla:

create table nombres (cod_usuario integer not null,
nombre varchar(20),
apellidos varchar (40),
primary key(cod_usuario))

ya que si la hago con identity este solo se incrementa y si necesito borrar un campo este no parte desde el codigo que se borro parte con el siguiente correlativo.

de antemano gracias
mmmmmmmmmmm, a seguir como mono porfiado

Desconectado negroVeloz

  • Experto
  • *****
  • Mensajes: 2900
  • CSM, Biónico, Alemán, Entendido y Facho de cuneta
Re:consulta SQL-transac
« Respuesta #1 en: Noviembre 15, 2011, 10:26:38 am »
MySQL, Postgres o MSSQL?

Con postgres podrías crear un Trigger que se ejecute al eliminar un registro, luego de eso cuentas el Max(Id) y reestableces la secuencia.
Cuando alguien ingrese un registro tomará el valor de la secuencia.

Si estás usando MySql 5, creo que ya tiene triggers.

Desconectado Mithrandir

  • Avanzado
  • ****
  • Mensajes: 1666
Re:consulta SQL-transac
« Respuesta #2 en: Noviembre 15, 2011, 11:23:59 am »
MySQL, Postgres o MSSQL?

Con postgres podrías crear un Trigger que se ejecute al eliminar un registro, luego de eso cuentas el Max(Id) y reestableces la secuencia.
Cuando alguien ingrese un registro tomará el valor de la secuencia.

Si estás usando MySql 5, creo que ya tiene triggers.

mssql

 :?? :?? :?? :?? :?? :?? :?? :?? :?? :?? :??
mmmmmmmmmmm, a seguir como mono porfiado

Desconectado negroVeloz

  • Experto
  • *****
  • Mensajes: 2900
  • CSM, Biónico, Alemán, Entendido y Facho de cuneta
Re:consulta SQL-transac
« Respuesta #3 en: Noviembre 15, 2011, 11:26:58 am »

Desconectado DON QUELO

  • Moderador
  • Experto
  • *****
  • Mensajes: un montón
  • Que Hubo?
Re:consulta SQL-transac
« Respuesta #4 en: Noviembre 15, 2011, 11:28:09 am »
... si es que entendi bien la pregunta...

o mas simple pue.. antes de insertar un registro nuevo, vas a leer el ID,  con un max y lo incrementas en 1 (o en lo que corresponda)

y luego insertas el registro, eso es lo que se hace usualmente en cualquier motor de BD
Hemos pronunciado no sé cuántos millones de veces la palabra "libertad", pero no sabemos lo que es, porque no la hemos vivido, y la estamos interpretando como permisividad.

José Saramago

Desconectado Mithrandir

  • Avanzado
  • ****
  • Mensajes: 1666
Re:consulta SQL-transac
« Respuesta #5 en: Noviembre 15, 2011, 11:28:40 am »
Microsoft SQL Server

si ese pero al resto quede plop por eso puse esas caras :?? :?? :?? :?? :?? :?? :??
mmmmmmmmmmm, a seguir como mono porfiado

Desconectado negroVeloz

  • Experto
  • *****
  • Mensajes: 2900
  • CSM, Biónico, Alemán, Entendido y Facho de cuneta
Re:consulta SQL-transac
« Respuesta #6 en: Noviembre 15, 2011, 11:43:58 am »
... si es que entendi bien la pregunta...

o mas simple pue.. antes de insertar un registro nuevo, vas a leer el ID,  con un max y lo incrementas en 1 (o en lo que corresponda)

y luego insertas el registro, eso es lo que se hace usualmente en cualquier motor de BD
El problema con eso, es que si 2 procesos tratan de ingresar al mismo tiempo un registro podrías tener un Id duplicado.

si ese pero al resto quede plop por eso puse esas caras :?? :?? :?? :?? :?? :?? :??
Ah, Ok.
Lo que pasa es que puedes usar un disparador (Trigger) que ejecuta una función. Por ejemplo si creas un Trigger para cuando un usuario elimine la fila, este mandará a ejecutar un procedimiento almacenado. Por ejemplo:

--Este Trigger se ejecutará cada vez que se elimine un registro
Create Trigger mantiene_id On dbo.nombres For Delete
As

Declare @NuevoId int;

--Obtiene el último Id
Select @NuevoId = MAX(Id) From nombres;

--Resetea la secuencia
DBCC CHECKIDENT (nombres, RESEED, @NuevoId)

END

Cuando un usuario ingrese un nuevo registro, tomará el valor @NuevoId + 1.

Desconectado DesarrolloNet

  • Avanzado
  • ****
  • Mensajes: 2198
Re:consulta SQL-transac
« Respuesta #7 en: Noviembre 15, 2011, 11:55:27 am »
Estimado
con la sentencia (NOLOCK), evitas que 2 procesos la ejecuten al mismo tiempo,
al hacer el select lo deja bloqueado hasta terminar

yo lo haria asi

Declare @IdNuevo int


Select @IdNuevo= MAX(Id) +1 From tabla (NOLOCK)


insert into tabla (campo1,campo2)
values (@IdNuevo, valor2)


Desconectado DON QUELO

  • Moderador
  • Experto
  • *****
  • Mensajes: un montón
  • Que Hubo?
Re:consulta SQL-transac
« Respuesta #8 en: Noviembre 15, 2011, 11:56:39 am »
independiente de la plataforma....


mm para eso esta el manejo de errores, que si intenta insertar un registro con la PK existente, realice la creacion de la PK de nuevo, de esta manera te das la "otra vuelta" solo en caso de error y no "por si acaso"

 ;)

eficiencia->eficacia

ahora si existe la instancia de bloquear los select... no se como funcionará para procesos concurrentes cuando quieras leer una tabla con varios millones de registros, pero...

pero cada maestrito con su librito


Como consejo Mith-zata   siempre consideren el uso de indices y manejo de errores en los programas, es una buena practica, que al principio es pajera, pero pronto te acostumbras a trabajar "bien"
« Última modificación: Noviembre 15, 2011, 11:59:10 am por DON QUELO »
Hemos pronunciado no sé cuántos millones de veces la palabra "libertad", pero no sabemos lo que es, porque no la hemos vivido, y la estamos interpretando como permisividad.

José Saramago

Desconectado Mithrandir

  • Avanzado
  • ****
  • Mensajes: 1666
Re:consulta SQL-transac
« Respuesta #9 en: Noviembre 15, 2011, 13:22:44 pm »
El problema con eso, es que si 2 procesos tratan de ingresar al mismo tiempo un registro podrías tener un Id duplicado.
Ah, Ok.
Lo que pasa es que puedes usar un disparador (Trigger) que ejecuta una función. Por ejemplo si creas un Trigger para cuando un usuario elimine la fila, este mandará a ejecutar un procedimiento almacenado. Por ejemplo:

--Este Trigger se ejecutará cada vez que se elimine un registro
Create Trigger mantiene_id On dbo.nombres For Delete
As

Declare @NuevoId int;

--Obtiene el último Id
Select @NuevoId = MAX(Id) From nombres;

--Resetea la secuencia
DBCC CHECKIDENT (nombres, RESEED, @NuevoId)

END

Cuando un usuario ingrese un nuevo registro, tomará el valor @NuevoId + 1.

ya ok, me quedo claro


Citar
Como consejo Mith-zata   siempre consideren el uso de indices y manejo de errores en los programas, es una buena practica, que al principio es pajera, pero pronto te acostumbras a trabajar "bien"

a que te refieres con esto???????
mmmmmmmmmmm, a seguir como mono porfiado

Desconectado DON QUELO

  • Moderador
  • Experto
  • *****
  • Mensajes: un montón
  • Que Hubo?
Re:consulta SQL-transac
« Respuesta #10 en: Noviembre 15, 2011, 13:57:52 pm »
ya ok, me quedo claro

a que te refieres con esto???????


Que una "pifia" usual  cuando esta estudiando/partiendo es que en los programas (leguaje que sea) suele olvidar tomar en cuenta  lo que el programa debe hacer cuando se cae o cuando sucede una situacion que el programa no sabe controlar.

por ejemplo(bien tirado de las mechas): supongamos que estas programando una división, tienes que hacer que el programa sepa que hacer cuando alguien quiera dividir por 0, no es la idea que el programa se vaya de espaldas asi como asi y que sea "culpa del usuario", sino que de antemano sepas "que puede salir mal" y hacer que el programa sepa como comportarse en esas instancias.

tal como se hablaba mas arriba de que una PK podia repetirse y el programa llegaría hasta ahi no mas, la idea es que si sucede eso, el programa solo busque la solución y cree otra pk que si se pueda insertar


eso
Hemos pronunciado no sé cuántos millones de veces la palabra "libertad", pero no sabemos lo que es, porque no la hemos vivido, y la estamos interpretando como permisividad.

José Saramago

Desconectado Mithrandir

  • Avanzado
  • ****
  • Mensajes: 1666
Re:consulta SQL-transac
« Respuesta #11 en: Noviembre 15, 2011, 14:08:21 pm »

Que una "pifia" usual  cuando esta estudiando/partiendo es que en los programas (leguaje que sea) suele olvidar tomar en cuenta  lo que el programa debe hacer cuando se cae o cuando sucede una situacion que el programa no sabe controlar.

por ejemplo(bien tirado de las mechas): supongamos que estas programando una división, tienes que hacer que el programa sepa que hacer cuando alguien quiera dividir por 0, no es la idea que el programa se vaya de espaldas asi como asi y que sea "culpa del usuario", sino que de antemano sepas "que puede salir mal" y hacer que el programa sepa como comportarse en esas instancias.

tal como se hablaba mas arriba de que una PK podia repetirse y el programa llegaría hasta ahi no mas, la idea es que si sucede eso, el programa solo busque la solución y cree otra pk que si se pueda insertar


eso

okales me quedo mas claro
mmmmmmmmmmm, a seguir como mono porfiado

Desconectado Truco

  • Junior
  • ***
  • Mensajes: 534
  • Maestro
Re:consulta SQL-transac
« Respuesta #12 en: Noviembre 15, 2011, 14:48:24 pm »

Que una "pifia" usual  cuando esta estudiando/partiendo es que en los programas (leguaje que sea) suele olvidar tomar en cuenta  lo que el programa debe hacer cuando se cae o cuando sucede una situacion que el programa no sabe controlar.

por ejemplo(bien tirado de las mechas): supongamos que estas programando una división, tienes que hacer que el programa sepa que hacer cuando alguien quiera dividir por 0, no es la idea que el programa se vaya de espaldas asi como asi y que sea "culpa del usuario", sino que de antemano sepas "que puede salir mal" y hacer que el programa sepa como comportarse en esas instancias.

tal como se hablaba mas arriba de que una PK podia repetirse y el programa llegaría hasta ahi no mas, la idea es que si sucede eso, el programa solo busque la solución y cree otra pk que si se pueda insertar


eso

deberiay ser informático...
Why Don't You Just... SHUT THE HELL UP!!!


Desconectado braulio

  • Junior
  • ***
  • Mensajes: 263
Re:consulta SQL-transac
« Respuesta #13 en: Noviembre 15, 2011, 16:25:19 pm »
Si es para efectos de estudio, estaría bien controlar errores mediante triggers... ahora no me imagino controlar los errores mediante triggers (en la bd) cuando tienes millones de registros.

Los sistemas de gestion de bases de datos controlan internamente el bloqueo de las tablas para las modificaciones que se realizan por tanto aquello de bloquear las tablas para hacer una modificación me parece que ya no se usa.

Desconectado Tandersan

  • Experto
  • *****
  • Mensajes: 10029
Re:consulta SQL-transac
« Respuesta #14 en: Noviembre 16, 2011, 12:25:46 pm »
El LOCK lo usa el motor para impedir que dos usuarios efectúen una modificación en el mismo dato en el mismo momento; pero no tiene relación con obtener un dato, incrementarlo, y adicionar. Si dos usuarios usan un select max(id) from tabla, obtendrán el mismo valor. Si le adicionan uno y van a insertar, uno lo alcanzará a hacer, el otro error de duplicidad de llave.

Yo para estas cosas corté por lo sano: número autogenerado en campo ID, y si tengo que borrar me da lo mismo que no sean secuenciales, ya que solo se usan para indicar unívocamente un registro, pero más utilidad no debería tener. Es más ahora no les encuentro tanto sentido, para eso mejor modelar las PK y FK en el diseño lógico, y controlar con datos reales esto.

En el caso de los procesos de BI, acá utilizaron un secuenciador de PowerCenter para aumentar el número y es una paja, porque frecuentemente se pillan procesos y quedan sin insertar el dato. Adicional, que está mal implementado.
Structure. Logic. Function. Control.
A structure cannot stand without a foundation.
Logic is the foundation of function.
Function is the essence of control.
I am in control.

Tags:
     


    A la memoria de Alex Feliú a.k.a Rommel