que es mas optimo para llevar el control referencial...
bloquear tabla -> insertar -> get last id -> desblokear tabla
usar el valor optenido de last insert id en otra insercion, consulta o lo que sea...
o mysql_last_id () que devuelve el ultimo valor insertado? esto me genera una duda, y es si devuelve el ultimo valor de un query, o se tiene que ejecutar un metodo espesifico para insertar...
volviendo a sql.. sera posible blokear y desblokear tablas durante un procedimiento?
que metodo utilizan para mantener la integridad en myisam en el siguiente ejemplo:
bd:
usuario {datos tipicos de usuario}
producto {tipico del producto, stock}
usuariohistorial{usuario,producto,cantidad,fecha}
el proceso es que cuando un usuario compra un producto, este deve descontarse de producto y añadirse en el historial del usuario.
ya sea una solucion con puro sql o con php (o con codeigniter si es posbile)
mi problema es que nunca e usado myisam, e preferido innoDB por tener referencias, pero ahora empiezo con proyectos en los que innoDB me es muy pesado.
como mencionaron ase unos post atras...
mysql_insert_id() devuelve el utimo valor generado en el script
Citar<?php
$link = mysql_connect('localhost', 'prueba', '12345');
mysql_select_db('prueba');
mysql_query("INSERT INTO prueba (prueba) values ('prueba')");
sleep(20);
printf("Last inserted record has id %d\n", mysql_insert_id());
?>
ejecutenlo en 2 navegadores distintos para hacer la prueba
otra solucion para los que no usan php es
blokear tabla
insertar
get max(id)
desblokear tabla
tiene que ser con get max(id) por que last_insert_id() es global
A lo mejor no entendi bien, pero para que necesitas control referencial?
Podes simplemente restar 1 a la cantidad de productos en stock (producto.stock) mientras se cumpla que el stock del mismo sea mayor a 0, y luego en la misma consulta agregar dicho producto a la tabla de historial de usuario. UEl problema es que MyISAM no soporta transacciones. Pero existe una libreria en PHP para emularlas (http://www.deepbluesky.com/blog/-/myisam-transactions_20/).
Podrias probar algo asi, pero usando esa libreria para emular transacciones y evitar errores de escritra/lectura.
UPDATE producto SET producto.stock = producto.stock - 1 WHERE producto.id = $id AND producto.stock > 0;
INSERT INTO historialusuario (producto, algo_mas) VALUES ($id,$otra_cosa).
Saludos