ok muchas gracias por tu ayuda.. voy a implementar esa solucion porque no veo otra salida... pero te pregunto:
en la tabla de generador de id podria tener los ids de las otras tablas(donde se da el mismo caso): tu pones todos los ids en una sola(por ejemplo idpresupuesto para relacionarlo con su detalle?)
No hay ningún problema, hay dos opciones:
- O bien usas la tabla tal como está y te genera números únicos para cuantas tablas quieras (por supuesto quedan huecos entre tablas pero eso no es relevante).
- O creas otro campo en la tabla generadora para identificar la tabla para la que vas a generar (entonces habría que ajustar las sentencias de actualización y de obtención del valor en función de la tabla que hace la petición).
Si crees que tu aplicación es de muy alta concurrencia entonces es mejor curarse en salud y crear una tabla generadora por cada tabla maestra crítica, para evitar cuellos de botella.
No te preocupes, esta es una técnica muy común para generar números consecutivos (sin huecos) para campos diferentes a la clave primaria que así lo requieran, por ejemplo en la numeración de facturas, en cuyo caso la obtención de dicho número si debería ir inmerso en una transacción.
En tu caso que solo necesitas generar claves primarias (no necesariamente consecutivas) no es necesario hacer la llamada dentro de la transacción, esto evitará bloqueos por inperceptibles que sean.
En cualquier caso es mucho más barato en términos de consumo de recursos consultar y actualizar una tabla que tiene un solo campo y un solo registro que hacer un select max (id) o un select max(numero) a una tabla con 2 o 3 millones de registros.
Saludos.
PD: Vuelvo y te repito esta es solo una forma de encarar el problema, si investigas más acerca del motor de DB muy seguramente encontrarás otras maneras de hacerlo, quizá otro compañero tenga otras experiencias al respecto.