Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Obtener valor id AUTO_INCREMEN.

Estas en el tema de Obtener valor id AUTO_INCREMEN. en el foro de Bases de Datos General en Foros del Web. Estoy desarrollando una aplicación (PHP y Mysql) en que los usuarios pueden postear, y por simple seguridad he decidido guardar la ip y timestamp de ...
  #1 (permalink)  
Antiguo 02/03/2011, 11:05
 
Fecha de Ingreso: enero-2004
Mensajes: 236
Antigüedad: 20 años, 3 meses
Puntos: 4
Obtener valor id AUTO_INCREMEN.

Estoy desarrollando una aplicación (PHP y Mysql) en que los usuarios pueden postear, y por simple seguridad he decidido guardar la ip y timestamp de cada post.

Pero la idea es que sera una tabla muy grande, por lo tanto la optimización es primordial, entonces quiero guardar la ip en un documento de texto, ya que serian datos que en principio no tengo que utilizar, solo desde la parte de administración del sitio por algún reporte.

Entonces yo hago la consulta:
INSERT INTO posts (post_title,post_user_id,post_cont) VALUES('{$title}','{$user_id}','{$p_cont}',')

Y obtengo la ip y el timestamp para añadirlos al txt, pero me interesaría poner también el id que es autoicremen.

Claro que con el titulo del post y el usuario pues ya es algo. El caso es que guardaría la ip de varias acciones, comentarios, mensajes, etc y seria mejor guardar el id si es posible.

Resumen: Como obtengo el id (que es autoincremen) de un insert que acabo de hacer sin realizar una segunda consulta.

Si utilizo LAST_INSERT_ID() seguidamente podría haber un cruce de datos.
  #2 (permalink)  
Antiguo 02/03/2011, 11:24
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Obtener valor id AUTO_INCREMEN.

Cita:
Pero la idea es que sera una tabla muy grande, por lo tanto la optimización es primordial
¿A qué le llamas "muy grande" en cuanto a tabla?
Cita:
Y obtengo la ip y el timestamp para añadirlos al txt, pero me interesaría poner también el id que es autoicremen.
Para eso en PHP existe la función mysql_insert_id().
Cita:
Si utilizo LAST_INSERT_ID() seguidamente podría haber un cruce de datos.
¿Cruce de datos? ¿A qué te refieres?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 02/03/2011, 11:53
 
Fecha de Ingreso: enero-2004
Mensajes: 236
Antigüedad: 20 años, 3 meses
Puntos: 4
Respuesta: Obtener valor id AUTO_INCREMEN.

Cita:
Iniciado por gnzsoloyo Ver Mensaje
¿A qué le llamas "muy grande" en cuanto a tabla?
Pues no lo se, pero si estoy trabajando en esto es porque tengo la esperanza de que asi sea, varios millones de posts, si ya se que no va a ser asi me dedico a otra cosa, pero almenos la aplicación estara preparada por si cumple espectativas.

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Para eso en PHP existe la función mysql_insert_id().
mysql_insert_id() no es lo mismo que LAST_INSERT_ID() ?? o bueno la forma correcta de hacerlo, es decir devuelve el ultimo id intoducido en la tabla?. Si no es asi y devuelve el id de la ultima consulta de ese codigo, ahora ya lo comprendo.

Cita:
Iniciado por gnzsoloyo Ver Mensaje
¿Cruce de datos? ¿A qué te refieres?
Me refiero a que hago el insert, y segidamente hago la petición de el ultimo id instertado en la tabla; si entre esos dos instantes otro post se inserta, me va a devolver el que no es.

El caso es que al leer en http://php.net/manual/es/function.mysql-insert-id.php
"Como mysql_insert_id() en la última consulta que ha funcionado, asegúrese de llamar a mysql_insert_id() inmediatamente despues de la consulta que genera el valor."
Crei entender que deves ponerlo inmediatamente despues de la consulta para evitar en lo posible ese cruze de datos con otra peticion que pueda estar realizando otro visitante, pero ahora supongo se refiere simplemente a ponerlo despues ya que devuelve el id de la ultima consulta de esa instancia de codigo que se esta ejecutando y no el ultimo id introducido en la tabla por cualquiera.
  #4 (permalink)  
Antiguo 02/03/2011, 12:05
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Obtener valor id AUTO_INCREMEN.

Cita:
Crei entender que deves ponerlo inmediatamente despues de la consulta para evitar en lo posible ese cruze de datos con otra peticion que pueda estar realizando otro visitante, pero ahora supongo se refiere simplemente a ponerlo despues ya que devuelve el id de la ultima consulta de esa instancia de codigo que se esta ejecutando y no el ultimo id introducido en la tabla por cualquiera.
Técnicamente esa es la ida, pero siempre hay alguna solución, como usar transacciones, o realizar toda la operación en un procedimiento almacenado (que se ejecutan en la base y en una sola transacción). Las primeras evitan inserciones entremedio y las dejas en espera hasta que se libera todo, además de servir para asegurarse d que todo funcionó bien, y los datos se guardaron bien antes de confirmar todo.
Por otro lado, mysql_insert_id() opera sobre la conexión y recurso devuelto por la ejecución de la consulta de inserción, así que técnicamente debería ser independiente de las nuevas inserciones.
En cuanto a la tabla que mencionas, si el problema es que puede que llegue a millones de registos lo más importante en realidad nos son tanto los IDs que tenga, sino que esté correctamente definida y normalizada. En otras palabras, lo que debes modelar bien en ese caso es la base de datos, y no preocuparte tanto todavía por los IDs, que son asunto procedimental.
Empieza por optimizar la base. Para la aplicación siempre hay tiempo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 02/03/2011, 12:34
 
Fecha de Ingreso: enero-2004
Mensajes: 236
Antigüedad: 20 años, 3 meses
Puntos: 4
Respuesta: Obtener valor id AUTO_INCREMEN.

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Por otro lado, mysql_insert_id() opera sobre la conexión y recurso devuelto por la ejecución de la consulta de inserción, así que técnicamente debería ser independiente de las nuevas inserciones.
Usare mysql_insert_id() entonces.

Cita:
Iniciado por gnzsoloyo Ver Mensaje
En cuanto a la tabla que mencionas, si el problema es que puede que llegue a millones de registos lo más importante en realidad nos son tanto los IDs que tenga, sino que esté correctamente definida y normalizada. En otras palabras, lo que debes modelar bien en ese caso es la base de datos, y no preocuparte tanto todavía por los IDs, que son asunto procedimental.
Empieza por optimizar la base. Para la aplicación siempre hay tiempo.
Cierto, tendre que dedicar más tiempo a eso, pero en todo caso no me parece mala idea separar las ip desde un principio.

Muchas gracias por tus respuestas.

PD: He estado dandole vueltas a lo que me comentas de la normalización, y quizas es buena idea crear dos tablas, relacionar los campos entre si y a la segunda tabla añadirle los campos ip y timestamp, y realizar las consultas en la primera. No tengo ni idea de como pero ya lo estudiare. Esta formula aumenta el tamaño (respecto a usar la formula del txt) de la DB pero entiendo que la rapidez de las consultas no se verian afectadas, y la inserción del post seria más rapida ya que no tendria que añadir los datos en dos recursos.

Última edición por llnitoll; 02/03/2011 a las 13:06
  #6 (permalink)  
Antiguo 02/03/2011, 13:13
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Obtener valor id AUTO_INCREMEN.

Exactamente. El sentido de las normalizaciones es ente otras cosas evitar las redundancias y mantener las consistencias. Cuando una tabla está bien normalizada no sólo has tenido que definir bien las PK, sino que además la carga se "aliviana" en cuanto a bytes, porque no tienes valores repetido, por ejemplo.
Este proceso se paga con consultas más compleja, pero también se gana con índices más pequeños, menores cantidades de bloques de lectura por consulta (más rápidas), y estas cosas permiten que el algoritmo planificador de consultas tenga más opciones para generar optimizaciones por sí mismo.
Hay muchas ventajas, pero es un terreno muy teórico para la mayoría. Las explicaciones puedrn sonar confusas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 02/03/2011, 13:31
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Obtener valor id AUTO_INCREMEN.

Estaría bueno que nos postearas las estructura (el CREATE TABLE e esa tabla), si quieres alguna sugerencias adicionales de normalización.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:49.