Ir al contenido



Foto

Como usar un id autoincrementable con dbexpress


  • Por favor identifícate para responder
8 respuestas en este tema

#1 axesys

axesys

    Advanced Member

  • Moderadores
  • PipPipPip
  • 612 mensajes
  • LocationLos Mochis

Escrito 24 enero 2009 - 11:20

Tengo una tabla en una base de datos oracle con dos campos que son un campo id numerico y un campo nombre varchar, quiero que al llenar el campo nombre en un dbgrid no me pida el id, luego que haga el post se asigne automáticamente un id.

Cual creen que sea la mejor forma de hacerlo usando dbexpress?


Ax
  • 0

#2 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.908 mensajes
  • LocationMéxico

Escrito 24 enero 2009 - 11:22

En oracle no existen los AutoIncrementables. Lo que debes hacer es crear una secuencia y luego con un trigger generar el valor de la secuencia e insertarlo en el campo Id.

El uso con dbExpress no debe resultarte un problema ya que el no es el responsable de esa generación.

Saludos
  • 0

#3 axesys

axesys

    Advanced Member

  • Moderadores
  • PipPipPip
  • 612 mensajes
  • LocationLos Mochis

Escrito 24 enero 2009 - 11:34

Gracias por tu respuesta poliburro intentaré por ahí entonces


Ax
  • 0

#4 Roberboy

Roberboy

    Newbie

  • Miembros
  • Pip
  • 5 mensajes
  • LocationTlaxcala

Escrito 16 abril 2009 - 08:08

Mi opinón sobre las secuencias que usa oracle, es la siguiente, existe una desventaja en cuanto al uso de secuencias, ya que cualquier número generado por una secuencia ya no puede ser generado nuevamente en caso de que exista cualquier error ajeno al campo autonumérico donde se guardará el valor de generado por la misma secuencia ( es algo que se llama número generado, número quemado), lo cual da como resultado que puedan existir huecos entre los números que realmente son insertados en la tabla.

Otra alternativa es el uso de una consulta previa a la tabla para recuperar el último valor generado (mediante un max) e incrementarlo en 1, pero la consulta debe ser realizada mediante la sentencia select for update para bloquear la tabla justo antes de la inserción y así­ evitar que se otorge otro valor igual a otro usuario que intente insertar otro registro en la misma tabla.
  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.001 mensajes
  • LocationRepública Dominicana

Escrito 16 abril 2009 - 08:18

Muchas gracias por esta información Roberboy, no sabí­a que Oracle tení­a esa desventaja, Bienvenido al foro compañero ;).

Saludos.
  • 0

#6 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.908 mensajes
  • LocationMéxico

Escrito 16 abril 2009 - 09:29

Muchas gracias por esta información Roberboy, no sabí­a que Oracle tení­a esa desventaja, Bienvenido al foro compañero ;).

Saludos.


En realidad no es una desventaja de oracle ene. Por definición un campo autoincrementable debe generar valores únicos e irepetibles. Tanto los campos Identity de Sql Server como los AutoInc de Mysql, access, etc Presentan este comportamiento. Y por supueesto cada motor ofrece maneras de redefinir los valores del contador. Así­ sucede con orale. Las secuencias pueden ser redefinidas.

Coincido con rebertboy en el sentido de que usar campos autoincrementables genera huecos. Por tanto la solución optima es calcular el siguiente Id  como lo menciona él mismo.

Saludos afectuosos.
  • 0

#7 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.395 mensajes
  • LocationMéxico

Escrito 16 abril 2009 - 09:38

Coincido con rebertboy en el sentido de que usar campos autoincrementables genera huecos. Por tanto la solución optima es calcular el siguiente Id  como lo menciona él mismo.


Hola

Pero entonces de que sirve tener un campo autoincrementable, mejor se usa un ID de tipo entero donde vas acumulando el valor.

Personalmente evito ese tipo de campos y me voy por la carretera vieja, al final tal ves sea menos costosa :)

Salud OS
  • 0

#8 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.908 mensajes
  • LocationMéxico

Escrito 16 abril 2009 - 09:46


Coincido con rebertboy en el sentido de que usar campos autoincrementables genera huecos. Por tanto la solución optima es calcular el siguiente Id  como lo menciona él mismo.


Hola

Pero entonces de que sirve tener un campo autoincrementable, mejor se usa un ID de tipo entero donde vas acumulando el valor.

Personalmente evito ese tipo de campos y me voy por la carretera vieja, al final tal ves sea menos costosa :)

Salud OS


Existen opiniones divididas al respecto. Hay quienes abogan por la rapidez en la generación de Ids únicos sin necesidad de consultar la tabla especialmente si esta tiene millones de registros y es de muy alta transaccionalidad. Y hay quienes preferimos el método comentado por robert.

Para ambos la razon nos asiste, Así­ que lo mejor es usar lo que mejor le funcione a cada quien.

Saludos.
  • 0

#9 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.071 mensajes
  • LocationRepública Dominicana

Escrito 16 abril 2009 - 12:26

Saludos.

La palabra depende cae bien para este tema, si es para una tabla que no tiene importancia su secuencia como tal por ejemplo: Tipo de Cliente, veo muy bien el uso de auto incremento pero si es para una tabla de documento por ejemplo: Factura; si apoyo la moción de utilizar una tabla para guardar el valor en secuencia tal como explica Egostar.



sql
  1. CREATE SEQUENCE SEQ_1
  2. minvalue 0
  3. maxvalue 999999999999999999999999999
  4. START WITH 1
  5. INCREMENT BY 1
  6. nocache
  7. ORDER;
  8.  
  9. CREATE OR REPLACE TRIGGER TRG_BEFORE_INSERT BEFORE INSERT
  10. ON TABLA1 FOR EACH ROW
  11. BEGIN
  12. IF :NEW.ID IS NULL THEN
  13.   SELECT SEQ_1.NEXTVAL INTO :NEW.ID FROM dual;
  14. END IF;
  15. END;


  • 0