[英]Random Number Generation in Mysql PHP
我有1600萬條記錄,並且每個記錄都需要一個8位數的UNIQUE隨機數,我也希望所有數字都以01開頭,並將它們存儲在單獨的表中,因此我可以為每個記錄分配UNIQUE數。
我不確定如何在PHP中執行此操作以獲取1600萬個唯一編號?
請幫忙?!
J.
使用您指定的內容,這似乎是不可能的。
您需要從給定的8位數字中獲得16,000,000個唯一數字,其中前導2為01 。
這樣您只剩下6個數字 ,因此您的范圍將是1,000,000個數字
從01000000到01999999 。
這似乎根本不正確。
約翰,關於您對pavium的評論,如果您需要所有數字的長度完全相同,但不一定是隨機的,則可以使用ZEROFILL MySQL屬性以及auto_increment索引。
試試這個:GUID
<?
echo str_replace ("}","",str_replace("{","",com_create_guid()));
?>
最簡單的方法是先生成一個16M數字列表,然后對它們進行隨機排序,然后將每個映射到您的記錄,這幾乎可以在PHP本機函數中完成。
我添加了一個步進循環,以便它不會生成太大的數組。 但這也意味着id看起來有點像無能為力,但仍然是隨機數。
也許有人可以使用旋轉字符串想出更好的解決方案? 我現在下班了。 :)
為每條記錄生成唯一編號的通常方法是具有一個auto_incrementing值-因此它們將是唯一的,但不是隨機的。
..並且它們將由MySQL而不是PHP生成。 我認為在PHP中生成1600萬個隨機但不同的數字將是巨大的開銷。
這些數字必須是隨機的嗎? 也許唯一性是更重要的要求?
與其隨機生成數字並努力保持已選擇的曲目號,不如按順序生成數字但按隨機順序更新記錄呢?
因此,這是一個完全MySQL解決方案。 沒有PHP,沒有循環,只是一個批處理更新語句:
UPDATE
your_table,
(SELECT @rownum:=@rownum+1 rownum, t.id
FROM
(SELECT @rownum:=0) r,
(SELECT id FROM your_table ORDER BY RAND()) t
) p
SET unique_num = 100000000 + p.rownum
WHERE p.id = your_table.id
更換your_table
與表名, unique_num
與這里獨特的號碼將被存儲於列和id
與你的表的主鍵列。
p / s:經過測試至少可以在MySQL 5.1.37上運行
讓mysql為您做:
如果您確實需要前導零,則從列中刪除auto_increment,將其更改為varchar(10)並使用UPDATE附加0
我喜歡為隨機主鍵使用16個字符的基數為60的varchar。 這是一張小桌子:
mysql> create table foo (k varchar(16), v varchar(255), primary key(k));
...這是一些基本的PHP,它將擊中函數k()直到找到未使用的鍵。
<?php
require_once 'connect.php';
$v = 'A value that needs a unique random key.';
while (!mysql_query("INSERT INTO foo VALUES ('" . k() . "', '$v')")) {};
function k() {
$t = "0123456789ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
$r = "";
for ($i = 0; $i < 16; $i++) {
$r .= substr($t, rand(0, 59), 1);
}
return $r;
}
?>
發生碰撞的機會很小,為-60至16,因此k()幾乎永遠不會被調用兩次。 獎勵:如果我需要將該鍵變大,那就是varchar,這樣我就可以添加字節而不會占用表中已經存在的所有內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.