php - una - ¿Cómo generar un ID único en MySQL?
uniqid mysql (13)
A continuación se muestra solo como referencia del identificador aleatorio único numérico ...
te puede ayudar ...
$query=mysql_query("select * from collectors_repair");
$row=mysql_num_rows($query);
$ind=0;
if($row>0)
{
while($rowids=mysql_fetch_array($query))
{
$already_exists[$ind]=$rowids[''collector_repair_reportid''];
}
}
else
{
$already_exists[0]="nothing";
}
$break=''false'';
while($break==''false''){
$rand=mt_rand(10000,999999);
if(array_search($rand,$alredy_exists)===false){
$break=''stop'';
}else{
}
}
echo "random number is : ".$echo;
y puede agregar char con el código como -> $rand=mt_rand(10000,999999) .$randomchar; // assume $radomchar contains char;
$rand=mt_rand(10000,999999) .$randomchar; // assume $radomchar contains char;
Estoy programando un script usando PHP y MySQL y quiero obtener una identificación única (que consta de una cadena: mayúsculas y minúsculas con números) como: gHYtUUi5b
. Encontré muchas funciones en PHP que pueden generar tales números, ¡pero tengo miedo de cómo asegurar que la identificación sea única!
ACTUALIZACIÓN : uuid es largo, me refiero a una identificación como: (P5Dc) un 11 caracteres alfanuméricos.
Cómo generar los unique_ids es una pregunta útil, ¡pero parece que estás haciendo una suposición contraproducente acerca de cuándo los generas!
Mi punto es que no necesita generar estos ID únicos al momento de crear sus filas, porque son esencialmente independientes de los datos que se insertan.
Lo que hago es generar previamente las ID únicas para su uso futuro, de esa manera puedo aprovechar mi tiempo dulce y absolutamente garantizar que sean únicas, y no hay procesamiento que se realice en el momento de la inserción.
Por ejemplo, tengo una tabla de pedidos con order_id en ella. Esta identificación se genera sobre la marcha cuando el usuario ingresa el pedido, incrementalmente 1,2,3, etc. para siempre. El usuario no necesita ver esta identificación interna.
Luego tengo otra tabla - unique_ids con (order_id, unique_id). Tengo una rutina que se ejecuta todas las noches y que carga previamente esta tabla con suficientes filas de unique_id para cubrir las órdenes que podrían insertarse en las próximas 24 horas. (Si alguna vez recibo 10000 pedidos en un día, tendré un problema, ¡pero sería un buen problema!)
Este enfoque garantiza la exclusividad y elimina cualquier carga de procesamiento de la transacción de inserción y la rutina de proceso por lotes, donde no afecta al usuario.
Esto genera identificadores aleatorios:
CREATE TABLE Persons (
ID Integer PRIMARY KEY AUTOINCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int
);
Por singularidad, lo que hago es tomar la marca de tiempo de Unix, añadirle una cadena aleatoria y usarla.
Puede que te guste la forma en que lo hacemos. Quería un código único reversible que pareciera "aleatorio", un problema bastante común.
- Tomamos un número de entrada tal como 1,942.
- Lo dejó en una cadena: "0000001942"
- Ponga los últimos dos dígitos en el frente: "4200000019"
- Convertir eso en un número: 4,200,000,019
Ahora tenemos un número que varía enormemente entre las llamadas y se garantiza que será inferior a 10,000,000,000. No es un mal comienzo.
- Convierta ese número en una cadena Base 34: "2oevc0b"
- Reemplace los ceros con ''y'' y los que tengan con ''z'': "2oevcyb"
- Cambio ascendente: "2OEVCYB"
La razón para elegir la base 34 es para que no nos preocupemos por las colisiones 0 / O y 1 / l. Ahora tiene una clave corta de apariencia aleatoria que puede usar para buscar un identificador de base de datos LARGA.
Si usa MySQL con una versión superior a 5.7.4, puede usar la función RANDOM_BYTES recién agregada:
SELECT TO_BASE64(RANDOM_BYTES(16));
Esto dará como resultado una cadena aleatoria como GgwEvafNLWQ3+ockEST00A==
.
También puede considerar usar crypt()
* para generar una identificación única [casi garantizada] dentro de sus contraints.
Una forma programática puede ser:
- añadir un INDICE ÚNICO al campo
- generar una cadena aleatoria en PHP
- bucle en PHP (while (! DO_THE_INSERT))
- generar otra cadena
Nota:
- Esto puede ser sucio, pero tiene la ventaja de ser agnóstico a DBMS
- Incluso si elige usar una función de generador de ID única específica de DBMS (UUID, etc.) es una buena práctica asegurar que el campo TIENE QUE SER ÚNICO , usando el índice
- el bucle no se ejecuta estadísticamente, se ingresa solo en el error de inserción
Usa la función UUID .
No conozco la fuente de sus procedimientos en PHP que genera valores únicos. Si se trata de una función de biblioteca, deberían garantizar que su valor sea realmente único. Consultar documentación. Usted debe, hovewer, utilizar esta función todo el tiempo. Si, por ejemplo, utiliza la función PHP para generar un valor único y luego decide utilizar la función MySQL, puede generar un valor que ya existe. En este caso, colocar UNIQUE INDEX en la columna también es una buena idea.
Yo uso UUID () para crear un valor único.
ejemplo:
insert into Companies (CompanyID, CompanyName) Values(UUID(), "TestUUID");
crypt()
como se sugiere y almacene salt en algún archivo de configuración, comience salt desde 1 y si encuentra un movimiento duplicado al siguiente valor 2. Puede usar 2 caracteres, pero eso le dará suficiente combinación para salt.
Puedes generar una cadena desde openssl_random_pseudo_bytes(8)
. Así que esto debería dar una cadena corta y aleatoria (11 caracteres) cuando se ejecuta con crypt()
.
Elimine la sal del resultado y solo habrá 11 caracteres que deberían ser suficientes al azar para más de 100 millones si cambia la sal en cada falla del azar.
<?php
$hostname_conn = "localhost";
$database_conn = "user_id";
$username_conn = "root";
$password_conn = "";
$conn = mysql_pconnect($hostname_conn, $username_conn, $password_conn) or trigger_error(mysql_error(),E_USER_ERROR);
mysql_select_db($database_conn,$conn);
// run an endless loop
while(1) {
$randomNumber = rand(1, 999999);// generate unique random number
$query = "SELECT * FROM tbl_rand WHERE the_number=''".mysql_real_escape_string ($randomNumber)."''"; // check if it exists in database
$res =mysql_query($query,$conn);
$rowCount = mysql_num_rows($res);
// if not found in the db (it is unique), then insert the unique number into data_base and break out of the loop
if($rowCount < 1) {
$con = mysql_connect ("localhost","root");
mysql_select_db("user_id", $con);
$sql = "insert into tbl_rand(the_number) values(''".$randomNumber."'')";
mysql_query ($sql,$con);
mysql_close ($con);
break;
}
}
echo "inserted unique number into Data_base. use it as ID";
?>
DELIMITER $$
USE `temp` $$
DROP PROCEDURE IF EXISTS `GenerateUniqueValue`$$
CREATE PROCEDURE `GenerateUniqueValue`(IN tableName VARCHAR(255),IN columnName VARCHAR(255))
BEGIN
DECLARE uniqueValue VARCHAR(8) DEFAULT "";
DECLARE newUniqueValue VARCHAR(8) DEFAULT "";
WHILE LENGTH(uniqueValue) = 0 DO
SELECT CONCAT(SUBSTRING(''ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789'', RAND()*34+1, 1),
SUBSTRING(''ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789'', RAND()*34+1, 1),
SUBSTRING(''ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789'', RAND()*34+1, 1),
SUBSTRING(''ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789'', RAND()*34+1, 1),
SUBSTRING(''ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789'', RAND()*34+1, 1),
SUBSTRING(''ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789'', RAND()*34+1, 1),
SUBSTRING(''ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789'', RAND()*34+1, 1),
SUBSTRING(''ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789'', RAND()*34+1, 1)
) INTO @newUniqueValue;
SET @rcount = -1;
SET @query=CONCAT(''SELECT COUNT(*) INTO @rcount FROM '',tableName,'' WHERE '',columnName,'' like '''''',newUniqueValue,'''''''');
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
IF @rcount = 0 THEN
SET uniqueValue = @newUniqueValue ;
END IF ;
END WHILE ;
SELECT uniqueValue;
END$$
DELIMITER ;
Y llame al procedimiento almacenado como GenerateUniqueValue (''tableName'', ''columnName''). Esto le dará un carácter único de 8 dígitos cada vez.