Blogs Media: CSS Mania | VivirLatino | Sentido Web | Apps Mania

Publicidad

Lun24Sep2007

Usar auto_increment para claves en MySQL

17:30 H (CET)| Temas: MYSQL

El uso de claves primarias con auto_increment en MySQL se debería tener en cuenta cuando el valor de la clave no es importante. Esto es, por ejemplo si tenemos una tabla de empleados y consideramos que la clave primaria es el número de empleado o el número de indentidad del ciudadano, pues quizás no sea buena idea usar auto_increment. Pero si la clave va a ser un número aleatorio, el valor no importa, el uso de auto_increment sería lo más adecuado.

Para definir una tabla con clave primaria con auto_increment, deberías ejecutar la siguiente sentencia:

create table `empleados` (
  `id` int (10)   NOT NULL AUTO_INCREMENT ,
  `nombre` varchar (250)   NOT NULL ,
  `correo` varchar (250)   NOT NULL  ,
 PRIMARY KEY ( `id` )  )

Con esta tabla, cuando insertemos un nuevo dato no se debe indicar el ID, ya directamente MySQL lo asignará.

El problema suele ser que muchas veces, cuando insertamos un registro, necesitamos la clave del registro nuevo para usarlo en la inserción en otra tabla relacionada. Por lo que si usamos el auto_increment, a priori no seremos capaces de saber cuál es el valor. En estas circunstancias deberemos usar la sentencia LAST_INSERT_ID(), la cual nos devolverá el ultimo id insertado, pero hay que tener cuidado con esto, porque con la concurrencia podemos obtener resultados no deseados.

También se puede reinicializar el valor del auto_increment, pero teniendo en cuenta que no se puede usar un valor menor o igual que uno que ya se haya usado. Por lo que habrá que tener cuidado en las exportaciones.

alter tabla tabla auto_increment=50;

Relacionados

Feedback (5) » Formulario

1. Fran García ~ Lunes, 24 Sep 2007 | 17:53H:

Suelo utilizar mucho la opción de auto_increment, en los casos que se pueda, como muy bien comentas y para solucionar el problema del LAST_INSERT_ID(), que no he utilizado nunca, lo que hago es obtener el máximo identificador de la tabla en cuestión y que el resto de valores sean los mismos que el usuario acaba de introducir. Algo así:

mysql_query("SELECT MAX(id) as id FROM empleados WHERE nombre='".$_POST['nombre']."' AND correo='".$_POST['correo']."'");

En este caso, la concurrencia sólo se daría en el caso en que ambas conexiones escribieran los mismos datos nombre y correo (rizando el rizo).

2. Alfil ~ Martes, 25 Sep 2007 | 11:52H:

No hay problema con la concurrencia. Según el manual de MySQL 5.0 el valor de LAST_INSERT_ID() es específico "de cada conexión, de modo que su valor de retorno no es afectado por las inserciones realizadas a través de otras conexiones" (Ver http://dev.mysql.com/doc/refman/5.0/es/example-auto-increment.html)

De hecho, era una duda terrible que tenía. Habitualmente uso sesiones y nunca se me ha repetido el valor obtenido de un campo autoincremento.

3. Luis ~ Martes, 25 Sep 2007 | 13:27H:

Hola Alfil, estuve mirando sobre eso con detalle y no lo encontré, muchas gracias. ¿Qué pasaría si usáramos un pool de conexiones?

Saludos

4. Richi ~ Miércoles, 30 Ene 2008 | 10:36H:

Justo después de hacer el insert haz que te devuelva el last insert id y te dará el 8 que querias una vez tengas el 8 haz el otro insert y problema resuelto...

No se si es lo que querias escuchar pero es lo que yo hago en estos casos.

Con el max_ID es más facil que ocurra errores que con el last_inser id. Si lo piensas, cuando tu insertas, existan miles de conexiones simultaneas, se irán creando y devolviendo segun tu insert. Yo lo he probado muchisimas veces y me da mejor resultado el lastInsert que no el max.

Opinión personal.

5. Waixo ~ Miércoles, 30 Ene 2008 | 10:37H:

Justo después de hacer el insert haz que te devuelva el last insert id y te dará el 8 que querias una vez tengas el 8 haz el otro insert y problema resuelto...

No se si es lo que querias escuchar pero es lo que yo hago en estos casos.

Con el max_ID es más facil que ocurra errores que con el last_inser id. Si lo piensas, cuando tu insertas, existan miles de conexiones simultaneas, se irán creando y devolviendo segun tu insert. Yo lo he probado muchisimas veces y me da mejor resultado el lastInsert que no el max.

Opinión personal.

Conversación

Nombre:

Email:

(no aparecerá)

URL:

(opcional)
¿Recordar datos?

↓ Comentarios (XHTML permitido)