最初,我想为用户创建某种id,但由于某些原因,我无法将我的数据表更改为unique
。所以我必须手动生成唯一的随机数据,所以我决定这样做:
SELECT CONCAT("B",FLOOR(10000 + RAND() * 89999)) AS random_number
FROM mmr
WHERE "random_number" NOT IN (SELECT rm FROM mmr) LIMIT 1
FLOOR(10000 + RAND() * 89999)
我能够获得10000-99999之间的随机数据,但它仍然不是唯一的。
mmr是一个包含2M以上数据的大表,rm类型为varchar(12)
。我期待的结果是Bxxxxx
我也尝试使用not exists
,但
答案 0 :(得分:1)
您尝试通过在SELECT
子句中引用其random_number
别名来引用WHERE
部分中随机生成的值。没有办法。同样,由于您的random_number
条件,您可能会将NULL
与NOT IN
字段进行比较。这将评估为NULL
(或有效FALSE
)。
你可以尝试:
SELECT random_number
FROM (
SELECT CONCAT("B",FLOOR(10000 + RAND() * 89999)) AS random_number
FROM mmr
) t
WHERE t.random_number NOT IN (
SELECT rm
FROM mmr
WHERE rm IS NOT NULL
)
LIMIT 1
现在,内部查询将生成与mmr
中的记录一样多的随机数,但在该查询中可能已经是重复的。之后,mmr
中已经的任何数字都会被过滤掉,从而使您的随机数少于mmr
中的记录。
(我在here on SO时询问了 'B' NOT IN ('A', NULL)
,并得到了一些很好的解释说明。
答案 1 :(得分:0)
试试这个:
SELECT CONCAT("B",FLOOR(10000 + RAND() * 89999)) AS random_number
FROM mmr
WHERE random_number NOT IN (SELECT rm FROM mmr WHERE rm IS NOT NULL)
编辑:为什么“限制1”在您的代码中?我删除了它,在这种情况下没用。它可能是你问题的原因,因为它只需要一条记录
答案 2 :(得分:0)
您可以将CROSS JOIN
与查询结合使用,并检查表格行中是否存在random_number
SELECT random_number
FROM mmr
CROSS JOIN (SELECT CONCAT("B",FLOOR(10000 + RAND() * 89999)) AS random_number) rmt
WHERE random_number <> rm AND rm IS NOT NULL
LIMIT 1