myisam control referencial?

Iniciado por Kase, 15 Mayo 2011, 04:07 AM

0 Miembros y 1 Visitante están viendo este tema.

Kase

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.

Kase

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

[u]nsigned

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.

Podrias probar algo asi, pero usando esa libreria para emular transacciones y evitar errores de escritra/lectura.

Código (sql) [Seleccionar]
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

No hay atajo ante la duda, el misterio se hace aquí...
Se hace carne en cada uno, el misterio es existir!