FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
El mejor método para generar IDs en tablas de movimiento
Saludos amigos,
En un entorno multiusuario, garantizar que las IDs (PKs) son únicas es parte fundamental de cualquier sistema bien estructurado. Actualmente, por ejemplo yo hago lo siguiente:
Función:
Consulta q_CalcIDNewPago:
sin embargo, no estoy seguro que sea la mejor forma de hacerlo. Cualquier aporte será bienvenido. Atte, Américo |
#2
|
||||
|
||||
Estas duplicando, de forma mas ineficiente*, lo que hace una bd. Usa:
Lo que es dificil es garantizar que sea perfectamente incremental sin 'huecos' pero eso es otro asunto. * p.d: Y adicionalmente este codigo trae un bug incorporado!
__________________
El malabarista. Última edición por mamcx fecha: 13-05-2024 a las 18:44:18. |
#3
|
|||
|
|||
Campo autonumerico
Creo que la mejor forma de generar un id es con campo autonumerico o autoincrementable. Ahí simplemente el motor de bd genera el siguiente número sin necesidad de averiguar cual es el mayor número de un campo de tabla.
|
#4
|
|||
|
|||
Cita:
|
#5
|
||||
|
||||
En firebird existen los generadores.
Los generadores siempre devuelven números diferentes (garantizado por la base de datos). Los generadores siempre se incrementan, a pesar de que la transacción falle (Rollback). Yo suelo dejar que la base de datos lo genere y me lo devuelva. Con esta sentencia y el generador en el trigger:
Cuando por alguna razón no puedo utilizarlo de esta manera, pido un número al generador y luego lo utilizo en el insert
|
#6
|
||||
|
||||
En tu caso, básicamente haces un SELECT MAX(ID).
Si justo al mismo tiempo dos usuarios piden el MAX(ID) les devolverá el mismo número. Luego al hacer el INSERT el primero logrará hacerlo y el segundo dará error porque estará insertando un duplicado. Particularmente esta forma de obtener un ID es muy ineficiente en Firebird. A pesar de tener índices por ese campo. Tiene que ver con la multi versión de registros. En otros motores no sabría decirte. Última edición por duilioisola fecha: 28-05-2024 a las 19:58:07. |
#7
|
||||
|
||||
Otro bug: Insertas 10 registros, el id va en 10. Ahora:
Borras el ultimo Borras todos Borras el primero etc. Un id debe ser global(en su contexto), único y *no repetible*
__________________
El malabarista. |
#8
|
|||
|
|||
Cita:
Como siempre muchas gracias a todos. Atte, Americo Torres |
#9
|
||||
|
||||
Negarse a usar lo que el motor te da 'gratis' raramente tiene sentido. No solo es esfuerzo innecesario, es como introduces errores inesperados y limitas al motor a la hora de hacer optimizaciones.
P.D: Yo trabajo en parte construyendo un motor de base de datos desde cero(https://spacetimedb.com) y te puedo asegurar que cada componente se hace con mas detalle de lo que te puedes imaginar. Ahora estoy solamente generando el diseño básico de la autenticación y llevo 3 semanas, como 10 borradores y todo porque en un motor de base de datos hay que tener en cuenta un montón de casos extremos. Usar el soporte de autonumericos del motor es lo que se debe de hacer a menos que tengas una buena razón, que SOLAMENTE puede ser: * Necesitas un id universal, así que usas una UUID * Necesitas evitar `saltos` para el caso de facturas, que entonces es complicado de hacer correcto, porque no solo debes hacer la lógica correctamente sino que debes coordinar a todas tus app que usen un modo transaccional mas estricto `SERIALIZABLE` y eso que no estoy seguro como seria en sql server * Tienes una llave natural
__________________
El malabarista. |
#10
|
|||
|
|||
Saludos
Preguntándole a ChatGPT, me dió la siguiente funcion, la cual ya implementé:
Resultado: Funcion:
Quedo atento a sus comentarios. Atte Última edición por darkamerico fecha: 30-05-2024 a las 21:44:37. |
#11
|
|||
|
|||
Super interesante en los proyectos en que andas amigo.
Quisiera tener tu level. Saludos Cita:
|
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Combinación de teclas para generar el método de una función | danny915 | Varios | 4 | 21-11-2014 19:24:03 |
Mejor Metodo para Verificar Numeros Primos | Victor Luis | Varios | 2 | 20-10-2013 07:33:03 |
Mejor Metodo para leer las teclas | pmtzg | Varios | 3 | 08-11-2007 19:05:16 |
Otro metodo de insercion que sea mejor hacerlo via query | ilichhernandez | Conexión con bases de datos | 2 | 01-07-2006 13:26:06 |
Mejor opcion para trabajar con tablas planas | andre | Tablas planas | 0 | 30-06-2004 20:17:03 |
|