MySQL - La mejor manera de hacer inserts....

   
Vista:

La mejor manera de hacer inserts....

Publicado por Fray (2 intervenciones) el 12/09/2007 19:22:50
Saludos:
Voy directo al grano. Tengo una tabla, por ejemplo cuenta_corriente_cliente que tiene 3 claves primarias (empresa, tipo_de_comprobante, nro_comprobante).
Anteriormente para hacer un insert en dicha tabla hacia:

Lock tables cuenta_corriente_cliente write;
select max(nro_comprobante) from cuenta_corriente_cliente where empresa = 1 AND tipo_de_comprobante = 1;

$nro_comp = $rs->fetchrow_array() +1;

y luego
insert into cuenta_corriente_cliente set empresa = 1, tipo_comprobante = 1 , nro_comprobante = $nro_comp

"hasta hache todo bien"

Luego...
unlock tables;

Con lo anterior me aseguro que nadie pueda leer ni escribir en dicha tabla mientras yo estoy mirando cual es el máximo numero para sumarle uno y hacer el insert.

Esto tiene varios problemas, por un lado no deja trabajar a nadie sobre esa tabla mientras estoy tratando de insertar, y otra, si comencé una transacción previamente, al hacer lock tables se hace un commit implícito, anulando toda posibilidad de hacer rollback.

Para los que piensen ¿y por que no usar una clave auto_increment en vez de hacer tanto rollo?, respondo. INNODB tiene un comportamiento que no es el esperado cuando se trata de campos auto_increment en claves múltiples, porque cuando uno esperaría que el auto_increment se incremente por cada juego de claves, lo hace de forma secuencial directa, si importarle si pertenece a una clave múltiple o no.

Mi problema y es por el cual pido ayuda es... Cual es?, para ustedes la mejor manera de proceder para hacer un insert en una tabla de clave múltiple en una base de datos InnoDB que es consultada actualizada e insertada de manera constante, sin tener que bloquear toda una tabla.

Gracias por contestar, de antemano.
Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:La mejor manera de hacer inserts....

Publicado por kain (124 intervenciones) el 12/09/2007 22:18:50
hola.

has probado a hacer todo el proceso en una sola linea. por ejemplo

insert into cuenta_corriente_cliente (empresa, tipo_comprobante,nro_comprobante) select 1,1,max(nro_comprobante) from cuenta_corriente_cliente where empresa = 1 AND tipo_de_comprobante = 1);

asi podrias ahorrarte el bloqueo de tabla.

espero que te sirva.
un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:La mejor manera de hacer inserts....

Publicado por Fray (2 intervenciones) el 13/09/2007 13:24:28
La verdad es que es una muy buena manera dehacerlo, o sea que lo que dices es que tengo que hacer un insert select y el select armarlo con los datos que quiero insertar y para el codigo busco el maximo?.
Lo voy a probar a ver que resulta. Gracias por tu tiempo.
Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar