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

Dar valor automatico (no repetido) Imposible?

Estas en el tema de Dar valor automatico (no repetido) Imposible? en el foro de Mysql en Foros del Web. Buenas, Tengo un pequeño problema con un website php // MySQL (y por ahora con php no pude encontrar solucion fiable) . La cosa es ...
  #1 (permalink)  
Antiguo 30/04/2009, 10:01
Avatar de bacc  
Fecha de Ingreso: febrero-2009
Ubicación: Argentina
Mensajes: 33
Antigüedad: 15 años, 2 meses
Puntos: 1
Pregunta Dar valor automatico (no repetido) Imposible?

Buenas,
Tengo un pequeño problema con un website php // MySQL (y por ahora con php no pude encontrar solucion fiable) .

La cosa es asi, yo tengo una tabla de productos que poseen ciertas caracteristicas propias, lo que necesito es que cuando se cargen estos productos se atogenere un NUI (numero unico de identificacion); de modo que no se repita y que sea de aprox 8 cifras.
x ejemplo:

+--------+----------+---------+---------------+
|.......ID......|Caracteristica1|Caracteristica2|C aracteristica3|
+--------+----------+---------+--------------+
| 58979856|........valor.......|........valor....... |........valor.......|
| 85679123|........valor.......|........valor....... |........valor.......|
| 68479845|........valor.......|........valor....... |........valor.......|
| 39875612|........valor.......|........valor....... |........valor.......|
+--------+----------+---------+-------------+


Que es lo que pasa.. los valores despues de un tiempo (depende de la garantia) se borran.... y ahi viene el problema.... x eso no puedo utilizar AutoIncrement; xq no se que valores vana estar disponibles, necesito que MySQL solo me ponga ese valor al azar. ¿ Se puede hacer eso ?


Saludos Coordiales!!
  #2 (permalink)  
Antiguo 30/04/2009, 10:20
Avatar de Avatar810  
Fecha de Ingreso: agosto-2007
Ubicación: Por rumbos Regios
Mensajes: 485
Antigüedad: 16 años, 8 meses
Puntos: 23
Respuesta: Dar valor automatico (no repetido) Imposible?

A ver como que no entendi...
Tu quieres que el ID se genere en automatico pero no que no sea autoincrement?
con borrar los valores te refieres a las caracteristicas o a borrar los productos (ID)?
en caso de borrar un ID se podria reutilizar este para agregar otro producto??
__________________
Una demo siempre funcionará correctamente hasta que toque algo tu (hasta ahora) cliente.
Avatar810
  #3 (permalink)  
Antiguo 30/04/2009, 11: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: 16 años, 4 meses
Puntos: 2658
Respuesta: Dar valor automatico (no repetido) Imposible?

Existe una función que puede darte esa solución, pero tiene dos problemas: 1) Devuelve un string de 36 caracteres siempre. 2) El string es alfanumerico.
este es el caso de
Código sql:
Ver original
  1. SELECT UUID();
Esto devuelve un identificador único universal, que no se puede repetir (basado en una clave de 128 bits), el manual de referncia dice:
Cita:
UUID()

Retorna un Universal Unique Identifier (UUID) (Identificador Único Universal) generado según la “DCE 1.1: Remote Procedure Call” (Apéndice A) CAE (Common Applications Environment) Especificaciones publicadas por The Open Group en Octubre 1997 (Número de Documento C706).

Se designa un UUID como número que es único globalmente en espacio y tiempo. Dos llamadas a UUID() generan dos valores distintos, incluso si estas llamadas se realizan en dos máquinas separadas y no están conectadas entre ellas.

Un UUID es un número de 128 bits representado por una cadena de cinco números hexadecimales en formato aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee:

* Los primeros tres números se generan de un valor temporal.
** El cuarto número preserva unicidad temporal en caso de que el valor temporal pierda moniticidad (por ejemplo, debido al cambio horario).
*** El quinto número es un número IEEE 802 de nodo que proporciona unicidad espacial. Un número aleatorio se sustituye si el último no está disponible (por ejemplo, debido a que la máquina no tenga tarjeta Ethernet, o no sabemos encontrar la dirección hardware de una interfaz en el sistema operativo). En este caso, la unicidad espacial no se puede garantizar. Sin embargo, una colisión debe tener una probabilidad muy baja.
Es posible que operando con esto, o bien con la función RAND() puedas dar con una solución.
En este último caso deberías usar
Código SQL:
Ver original
  1. SELECT LPAD((RAND()*1000000 DIV 1),8,'0');
Para obtener un string de 8 dígitos aleatorio.
__________________
¿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; 30/04/2009 a las 11:45
  #4 (permalink)  
Antiguo 30/04/2009, 13:03
Avatar de bacc  
Fecha de Ingreso: febrero-2009
Ubicación: Argentina
Mensajes: 33
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: Dar valor automatico (no repetido) Imposible?

gnzsoloyo, eso es lo que estoy neceistando... pero de 36 caracteres se me hace imposible de utilizar, ya que lo necesito para desp etiquetarlos !!

Pero bueno, esta la opcion 2 que yo tenia prevista,(en php) pero que sucede si el aleatorio que genera esta siendo usado ?? obviamente si vuelve error que genere otro, pero que pasa si existen bastantes id cargados la tabla... ? va a tardar mucho en generar el numero aleatorio, xq cada vez va a tener mas probabilidades de que le de un numero usado.

Otra opcion(casi diria unica) es hacer algo parecido a lo que hace con el numero de 36 en el punto de la IEEE 802; pero basandome en las caracteristicas de los productos, x ejemplo tomo 2 caracteristicas: color y marca. Entonces todos los de color "rojo" y marca "coco" van a estar en un grupo y trabajo con 4 digitos, de modo que me quede algo como: rojcocXXXX. Y aplico el random sobre las XXXX.

Que les parece? En donde tengo mas probabilidades que se pisen ? en 8 digitos numericos o de la ultima forma, filtrando por caracteristicas mas los 4 digitos ?
  #5 (permalink)  
Antiguo 30/04/2009, 13:30
Avatar de bacc  
Fecha de Ingreso: febrero-2009
Ubicación: Argentina
Mensajes: 33
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: Dar valor automatico (no repetido) Imposible?

y por ejemplo... no exite una forma de que mysql me devuelva en lugar de los valores existentes, los valores posibles?
  #6 (permalink)  
Antiguo 30/04/2009, 15:19
Avatar de Avatar810  
Fecha de Ingreso: agosto-2007
Ubicación: Por rumbos Regios
Mensajes: 485
Antigüedad: 16 años, 8 meses
Puntos: 23
Respuesta: Dar valor automatico (no repetido) Imposible?

Entre mayor es tu rango de valores mucho menor es tu probabilidad de duplicidad.

la cantidad de valores que puedes obtener con 8 numeros es
10^8 = 100;000,000 cien millones de valores
la cantida de valores con color (2 caracteres) marca (2 caracteres) y 4 digitos es
(# de colores que tengas las primeras 2 letras diferentes ) * (# de marcas que tengas las primeras 2 letras diferentes) * 10^4

dado que son variables inciertas es dificil hacer el calculo sin conocer tu universo de marcas y colores,

suponiendo que usas los 8 digitos al generar el random no debes mandar insertarlo asi nadamas, sino que debes hacer un select para validar si existe o no dentro d eun chiclo hasta que no encuentre nada....

hasta donde yo tengo entendido el mysql es solo una consulta de lo que tiene no de lo que NO tiene
__________________
Una demo siempre funcionará correctamente hasta que toque algo tu (hasta ahora) cliente.
Avatar810
  #7 (permalink)  
Antiguo 04/05/2009, 07:07
Avatar de bacc  
Fecha de Ingreso: febrero-2009
Ubicación: Argentina
Mensajes: 33
Antigüedad: 15 años, 2 meses
Puntos: 1
Información Respuesta: Dar valor automatico (no repetido) Imposible?

boys (& girls?)... al final no lo pude resolver directamente con mysql, lo hice con php.

Codifique EX+xxxx

en php :
con un rand(); luego un select (el ex mas los 4 numeros); luego si existe resultado otra vez repito el rand(); asi hasta que me de que no existe ese registro, y luego lo inserto.


Saludos!

PD: Dejo esto, por si alguien lo necesita.
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 07:37.