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

despues de una Alta que me muestre la clave primaria

Estas en el tema de despues de una Alta que me muestre la clave primaria en el foro de Mysql en Foros del Web. Saludos, estoy dando de alta un nuevo elemento en mi primera tabla de mi base, pero quiero que me regrese la clave primaria de ese ...
  #1 (permalink)  
Antiguo 30/04/2011, 18:36
 
Fecha de Ingreso: abril-2011
Ubicación: MEXICO
Mensajes: 42
Antigüedad: 13 años
Puntos: 0
Información despues de una Alta que me muestre la clave primaria

Saludos, estoy dando de alta un nuevo elemento en mi primera tabla de mi base, pero quiero que me regrese la clave primaria de ese elemento que recien inserte, pues la tengo en autonumerico, y a la vez esa clave la voy a usar para insertarla en mi segunda tabla junto con mas datos para asi asociar los datos de mi segunda tabla con la primera. Gracias...
  #2 (permalink)  
Antiguo 30/04/2011, 18:50
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: despues de una Alta que me muestre la clave primaria

Ajá... ¿Y cómo estás haciendo todo esto?
¿Stored Procedures? ¿A través de una aplicación en un lenguaje de programación? ¿Manualmente con SQL?
¿Cómo, exactamente?
__________________
¿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/05/2011, 08:46
 
Fecha de Ingreso: abril-2011
Ubicación: MEXICO
Mensajes: 42
Antigüedad: 13 años
Puntos: 0
Respuesta: despues de una Alta que me muestre la clave primaria

Actualmente estoy haciendo un programa en PHP, y desde ahi lo que realizo es las respectivas operaciones SQL para obtener la pk de la primera tabla y posterior de obtener esa pk la uso para insertarla en mi segunda tabla.

1- inserto datos en mi primera tabla.
2- hago una consulta con esos datos que recien inserte para obtener la pk de la primera tabla.
3- inserto la pk que obtuve de la consulta aterior en mi segunda tabla.

El riesgo que he de correr es que los datos que inserto en la primera tabla (sin contar la pk) se repite probablemente. es por eso que pregunto si existe alguna otra manera de asegurar que no tenga errores al momento de conseguir la pk de mi primera tabla....

Gracias...
PD: pk = primary key.
  #4 (permalink)  
Antiguo 02/05/2011, 09:14
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: despues de una Alta que me muestre la clave primaria

PHP tiene una función propia en su librería de conexión a MySQL que te devuelve precisametne la ultima ID autoincremental generada en un INSERT.
La puedes ver en el manual de referencia on-line de PHP: PHP:: Manual de PHP
Librería MySQL: mysql_insert_id() — Obtiene la ID generada en la última consulta
Librería MYSQLI (POO): mysqli->insert_id — Returns the auto generated id used in the last query

En los links encontrarás ejemplos de su uso bastante simples y comprensibles.

Cita:
El riesgo que he de correr es que los datos que inserto en la primera tabla (sin contar la pk) se repite probablemente. es por eso que pregunto si existe alguna otra manera de asegurar que no tenga errores al momento de conseguir la pk de mi primera tabla....
Una PK autoincremental no se puede repetir. Jamás. Lo que tienes que hacer es dejarle a MySQL el generarla y no andar consultando su último valor para crearla por ti mismo, especialmente si no vas a usar transacciones en tu gestion de la base (te recomiendo enfáticamente utilizarlas). En ese caso debes puedes mandar el INSERT indicando qué campos insertarás y omitiendo de la lista el de la PK. MySQL asumirá que ese valor es NULL y lo generará automáticamente.
Si no quieres indicar los campos a insertar lo que tienes que hacer es enviar un NULL en el lugar de la PK y MySQL se encargará del resto.
Ppara usar el valor devuelto en el autonumérico, simplemente lo invocas desde esa función en la siguiente sentencia.
Otra forma de gestionar todo es usar stored proedures, que además tienen otras ventajas, como seguridad, evitar el sql-injection, y el manejo de operaciones atómicas.. No sé si estás práctico con el tema.
Si no quieres usar transacciones, entonces lo que debes hacer es bloquear la tabla al momento de hacer la consulta del último valor, de modo de hacer una reserva de próxima ID. Eso se hace haciendo un
Código MySQL:
Ver original
  1. SELECT MAX(id) FROM tabla FOR UPDATE;

Consulta los detalles en el manual de referencia, si quieres: MySQL AB MySQL 5.0 Reference Manual
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 02/05/2011 a las 09:20
  #5 (permalink)  
Antiguo 02/05/2011, 09:29
 
Fecha de Ingreso: abril-2011
Ubicación: MEXICO
Mensajes: 42
Antigüedad: 13 años
Puntos: 0
Respuesta: despues de una Alta que me muestre la clave primaria

Cita:
Iniciado por gnzsoloyo Ver Mensaje
PHP tiene una función propia en su librería de conexión a MySQL que te devuelve precisametne la ultima ID autoincremental generada en un INSERT.
La puedes ver en el manual de referencia on-line de PHP: [URL="http://ar2.php.net/manual/es/"]PHP:: Manual de PHP[/URL]
Librería MySQL: [URL="http://ar2.php.net/manual/es/function.mysql-insert-id.php"]mysql_insert_id() [/URL]— Obtiene la ID generada en la última consulta
Librería MYSQLI (POO): [URL="http://ar2.php.net/manual/es/mysqli.insert-id.php"]mysqli->insert_id[/URL] — Returns the auto generated id used in the last query

En los links encontrarás ejemplos de su uso bastante simples y comprensibles.

Una PK autoincremental no se puede repetir. Jamás. Lo que tienes que hacer es dejarle a MySQL el generarla y no andar consultando su último valor para crearla por ti mismo, especialmente si no vas a usar transacciones en tu gestion de la base (te recomiendo enfáticamente utilizarlas). En ese caso debes puedes mandar el INSERT indicando qué campos insertarás y omitiendo de la lista el de la PK. MySQL asumirá que ese valor es NULL y lo generará automáticamente.
Si no quieres indicar los campos a insertar lo que tienes que hacer es enviar un NULL en el lugar de la PK y MySQL se encargará del resto.
Ppara usar el valor devuelto en el autonumérico, simplemente lo invocas desde esa función en la siguiente sentencia.
Otra forma de gestionar todo es usar stored proedures, que además tienen otras ventajas, como seguridad, evitar el sql-injection, y el manejo de operaciones atómicas.. No sé si estás práctico con el tema.
Si no quieres usar transacciones, entonces lo que debes hacer es bloquear la tabla al momento de hacer la consulta del último valor, de modo de hacer una reserva de próxima ID. Eso se hace haciendo un
Código MySQL:
Ver original
  1. SELECT MAX(id) FROM tabla FOR UPDATE;

Consulta los detalles en el manual de referencia, si quieres: [URL="http://dev.mysql.com/doc/refman/5.0/es/innodb-next-key-locking.html"][B]MySQL AB MySQL 5.0 Reference Manual[/B][/URL]
Gracias por la liga de bloqueo, me será útil!!!

Etiquetas: clave, primaria
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 09:11.