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

Autoincrement al tope

Estas en el tema de Autoincrement al tope en el foro de Mysql en Foros del Web. Hola, tengo la siguiente duda: Si yo tengo un id, el cual es un TYNINT, autoincrementable, y la clave primaria de una tabla. Hasta ahí ...
  #1 (permalink)  
Antiguo 30/05/2009, 12:04
 
Fecha de Ingreso: febrero-2008
Mensajes: 578
Antigüedad: 16 años, 9 meses
Puntos: 3
Autoincrement al tope

Hola, tengo la siguiente duda:

Si yo tengo un id, el cual es un TYNINT, autoincrementable, y la clave primaria de una tabla. Hasta ahí OK.

Pero si el último que inserté llegó al '127' OK, luego si inserto otro registro desde PHPMyAdmin no lo inserta, aparece el error: Duplicate entry '127' for key 'PRIMARY'

Hasta acá OK, pero si yo desde PHP tengo un formulario de alta, y al completarlo le doy aceptar, hace el INSERT sin ningún tipo de problemas y no aparece ningun error ni nada, y yo de esta forma no me enteraría que el autoincremento llegó al tope.

Hay algun comando de PHP o MYSQL donde te diga si finalmente se pudo insertar o no el registro ??

Espero haberme entendido.
Muchas gracias
  #2 (permalink)  
Antiguo 30/05/2009, 12:45
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 7 meses
Puntos: 300
Respuesta: Autoincrement al tope

Eso es porque TYNINT llega hasta 127 como máximo; si lo hubieras hecho con TyNINT unsigned, hasta 255. Esos no son tipos de campo apropiados para un auto_increment. Usa un smallint o un mediumint o un int mejor para tener más margen, y olvídate de esas comprobaciones.
Duplicate entry '127' for key 'PRIMARY' esto sería el aviso. No puedes duplicar una primary key y el tynint no avanza y el programa trata de insertar el mismo, con el consiguiente error.

Última edición por jurena; 30/05/2009 a las 12:57
  #3 (permalink)  
Antiguo 30/05/2009, 14:27
 
Fecha de Ingreso: febrero-2008
Mensajes: 578
Antigüedad: 16 años, 9 meses
Puntos: 3
Respuesta: Autoincrement al tope

Si , obvio que trataría de usar como mínimo un SMALLINT.
Siempre para los id autoincrementables uso un INT, pero mi pregunta se basa en que pasaría si justo tengo un id TYNINT autoincrement )no unsigned y debe insertar un registro el cual llevaría el 128 ??

Haciendo el insert desde PHPMyAdmin me tira ese error que comenté antes, pero desde código PHP no, es como que lo hubiese echo, pero después chequeando la base de datso veo qeu no lo hizo, entonces no hay alguna setencia de MySql que te diga si el insert se hizo correctamente o no ??
  #4 (permalink)  
Antiguo 30/05/2009, 21:38
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Autoincrement al tope

Cita:
Siempre para los id autoincrementables uso un INT, pero mi pregunta se basa en que pasaría si justo tengo un id TYNINT autoincrement )no unsigned y debe insertar un registro el cual llevaría el 128 ??
La respuesta es un poco evidente: Si el máximo número que un TINYINT SIGNED puede representar en los positivos es 127, cuando recupera el último valor para incrementar uno, se encuentra con el valor máximo... por lo que no puede sumar nada y queda en... 127.
El tema es simple: Cuando defines un tipo de dato numérico, nunca puedes pasa más allá del límite fijado por su tipo. Si lo que intentas hacer es una suma, simplemente no puede y descarta el sumando a agregar, produciendo el error Nro. 1264: "Out of range value adjusted for column 'id' at row 1".
__________________
¿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 31/05/2009, 15:08
 
Fecha de Ingreso: febrero-2008
Mensajes: 578
Antigüedad: 16 años, 9 meses
Puntos: 3
Respuesta: Autoincrement al tope

Claro, eso lo entiendo.
Pero cuando estoy programando en PHP para insertar un registro, haciendo de cuenta que yo no estoy ni enterado que no se puede sumar el autoincrement, no me devuelve ningún error...

Como que aparentemente el proceso se hizo correctamente.
Por eso pregunto si hay alguna sentencia de MySql para saber si el registro se ingresó correctamente a la base de datos o no.

Muchas gracias a todos.
  #6 (permalink)  
Antiguo 31/05/2009, 15:27
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Autoincrement al tope

Cita:
Pero cuando estoy programando en PHP para insertar un registro, haciendo de cuenta que yo no estoy ni enterado que no se puede sumar el autoincrement, no me devuelve ningún error...
Estás poniendo, como dice un viejo refrán, "el caro delante del caballo". Lo que en realidad te está fallando es la lógica de diseño: Tienes que diseñar la tabla con el rango de valores adecuado. Si estás poniendo un campo numérico de menor tamaño de lo que en el uso se necesita, lo que falló fue el análisis, no la tabla. No es suficiente suponer que usarás un campo de determinado tamaño, tienes que prevenir el problema antes que se produzca: Si supones que usarás TINYINT, usas SMALLINT, si supones SMALLINT usas INT... La idea es planear para el peor escenario posible, porque se escenario se va a dar eventualmente, y cuando la base está en funcionamiento un cambio de estructura es desastroso.
Cita:
no me devuelve ningún error...
Como ya te lo indiqué, eso no es cierto, te devuelve un error. Puede que no lo estés controlando debidamente, pero eso lo debes resolver con PHP...
Cita:
Por eso pregunto si hay alguna sentencia de MySql para saber si el registro se ingresó correctamente a la base de datos o no.
Normalmente, cuando el dato no se ingresa, el valor devuelto en la ejecución de la sentencia es cero ó -1, por lo que no debería ser necesario otra validación. Pero eso sigue siendo un problema de PHP, no de SQL.
Por otro lado, el PHP en ese caso si te da recursos para saber que pasó. Solamente tienes que usarlos correctamente.

Finalmente, hago hincapié en esto: Si estás teniendo problemas de rango de representación, tu problema es de implementación de la tabla: Si estás seguro de NUNCA usar mas de 200 valores puedes usar TINYINT, pero usar en un autoincrement un SIGNED es un desperdicio de recursos, ya que el autoincrement NUNCA usará los valores negativos, con lo que estás desperdiciando la mitad del rango.
Usa los campos con rango que exceda siempre el máximo posible de representación a usar.
__________________
¿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; 31/05/2009 a las 15:35
  #7 (permalink)  
Antiguo 31/05/2009, 16:27
 
Fecha de Ingreso: febrero-2008
Mensajes: 578
Antigüedad: 16 años, 9 meses
Puntos: 3
Respuesta: Autoincrement al tope

Ahora cheque los links que has puesto.
Muchas gracias por la respuesta, te agradezco el tiempo que te tomaste para responder y ahora me quedó un poco más claro.

Nuevamente muchas gracias.
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 14:01.