Ver Mensaje Individual
  #6 (permalink)  
Antiguo 17/03/2008, 07:06
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años, 2 meses
Puntos: 2658
Re: MYSQL Consultar e insertar datos al mismo tiempo

Técnicamente es posible, pero deberías crear un id_estado falso de entrada de modo que pudieras ingresar los datos del registro completo.
Me explico:
1. El objetivo de tener dos tablas distintas para los estados y los usuarios es, sin duda, para una buena normalización y evitar la redundancia de datos que sería incluir el nombre del Estado en cada usuario nuevo.
2. El problema, es que lo que buscas es ingresar los registros de ambos en una sola operación, pero como el del Estado tiene dos campos, o bien mandas los dos valores en el insert del usuario o dejas nulo el del Estado.
3. Como eso no es posible, o de lo contrario el segundo select jamás te devovlería el valor, tienes que mandar los dos datos...
4. Pero la tabla usuario no tiene ese segundo campo, por lo que te daría un error de cantidad de columnas en el INSERT.

Veamos:
1. La primera parte, el insert, es simple: se solucionaría con un TRIGGER, antes de insertar el ID_Estado le mande un REPLACE a la tabla Estados. Digo REPLACE para mandar una sola sentencia, si quieres verificar y después insertar en el trigger, es tu decisión. También sería correcto y no tendrías actualizaciones innecesarias.
2. La segunda parte, en nombre del Estado es la que causa el problema, tienes que enviarla al mismo tiempo.
3. Lo que yo haría es que:
a) la sentencia INSERT reciba un String y no un Integer, siguiendo un modelo como: "#### - XXXXXXXXXXX",
b) el trigger partiría el contenido en dos variables, la primera se la reasignaría al campo entrante, que ahora contendría solamente en Integer, aunque sea en un campo CHAR(), no hay que olvidar que el MySQL es contextual y va a interpretar lo que recibe si se corresponde, con el tipo de campo que debe almacenar; así, si recibe "00012" en un campo INT, lamacenará (12).
c) a su vez las dos partes las enviaría en un INSERT a la tabla estado, suprimiendo el string " - " inicial. Esto simpemente lo puedes hacer con las funciones LEFT() y RIGHT(), predefiniedo con LPAD() que el bloque inicial "####" se rellene con ceros a la izquierda, de modo de recibir siempre la misma longitud de numeros para que el LEFT() y el RIGHT() funcionen bien.

¿Se entiende bien, o te lo pongo en un ejemplo?