Php 随机唯一Mysql Id

Php 随机唯一Mysql Id,php,mysql,sql,Php,Mysql,Sql,我有一个表,希望使用1个mysql查询为其生成随机唯一值。 表结构如下: id | unique_id 1 | 1 2 | 5 3 | 2 4 | 7 等 唯一的\u id是整数10无符号 所以我希望每次都用唯一的随机值来填充unique_id字段,而不是我的示例中的1、5、2、7 Algorytm是: 1. Get 1 unique random value, which will not have duplicates in unique_id field 2. Create ne

我有一个表,希望使用1个mysql查询为其生成随机唯一值。 表结构如下:

id | unique_id
1  | 1
2  | 5
3  | 2
4  | 7


唯一的\u id是整数10无符号

所以我希望每次都用唯一的随机值来填充unique_id字段,而不是我的示例中的1、5、2、7

Algorytm是:

1. Get 1 unique random value, which will not have duplicates in unique_id field
2. Create new row with unique_id = result of 1 query
我试过了

SELECT FLOOR(RAND() * 9) AS random_number 
FROM table 
HAVING random_number NOT IN (SELECT unique_id FROM table) 
LIMIT 1
但它不会产生独特的价值


注:仅给出了乘数=9,例如,使用此类乘数很容易重现此问题。一种方法是使用id列,就像使用随机排列一样:

select id
from tables
order by rand()
limit 1
您的示例只返回一个值

要为每个id返回可重复的随机数,可以执行以下操作:

select id,
       (select count(*) from table t2 where rand(t2.id) < rand(t.id)) as randomnumber
from table t
注意:这将返回最大为表大小的随机数,不一定来自ID。这可能是件好事

最后,你可以得到一个想法,你试图工作与一个小把戏。计算md5散列,然后将前四个字符强制转换为整数,然后在表中检查:

SELECT convert(hex(left(md5(rand()), 4)), unsigned) AS random_number 
FROM table 
HAVING random_number NOT IN (SELECT unique_id FROM table) 
LIMIT 1

您需要将该值插入回表中。而且,不能保证您能够获得表中没有的值,但它最多可以用于数百万个值。

如果您可以使用MD5哈希作为唯一ID,请立即使用MD5。这几乎肯定每次都会生成一个唯一的ID


参考:

unique\u id是整数字段。我需要100%确定unique_id是唯一的。您是否尝试过增加RAND函数的乘数?在相对意义上,随着该池的缩小,更可能遇到现有标识符。unique_id字段的大小是否有任何限制?unique_id是整数10无符号的我将此添加到问题中。是的,增加乘数没有问题,但结果数字不会是唯一的,尽管如此,它们有时可以复制:我需要真正唯一的值,我没有出错的余地。乘数=9只是举个例子,用这样的乘数很容易复制这个问题。为了保证唯一性,你可能不得不使事情复杂化。需要在其中添加一个IF测试来检查所有现有的标识符。如果需要多个id——或者全部id——只需更改limit子句。您问题中的示例只返回了一个id。取消限制并从id集中为每个id获取唯一的编号-这显然不适用于0-8示例。为什么它们是唯一的?从表中选择id按兰德排序限制1将返回重复项soometimes@magalter . .. 我明白了。由于限制,您的示例只返回一行。一旦你有了一个稳定的排序顺序,如修改后的示例中所示,你将得到独特的结果。不过,如果你有很多数据,我会使用一个临时表。我会尝试解释我的目标。我需要一个随机唯一的id为新添加的记录。id字段是自动递增的,因此它不是随机的。唯一的_id必须是随机的。所以,在添加新行之前,我需要执行sql查询并获取1个随机且唯一的数字,以将其作为唯一的\u id表插入。所以算法是:1。获取新行2的1条唯一随机记录。使用此记录创建新行我稍微更改了我的问题,并添加了alghorytm步骤。
SELECT convert(hex(left(md5(rand()), 4)), unsigned) AS random_number 
FROM table 
HAVING random_number NOT IN (SELECT unique_id FROM table) 
LIMIT 1