【发布时间】:2022-01-12 13:07:51
【问题描述】:
我想在不使用过程的情况下使用唯一随机数填充表。
我尝试过使用this 回复,但没有成功。
我正在尝试做的是这样的事情,但要验证数字不会重复:
INSERT into table (row1,row2)
WITH RECURSIVE
cte AS ( SELECT 0 num, LPAD(FLOOR(RAND() * 99999999),8,0) random_num
UNION ALL
SELECT num+1, LPAD(FLOOR(RAND() * 99999999),8,0) random_num
FROM cte WHERE num < 100000-1)
SELECT random_num, null
FROM cte;
在上面的示例中,我能够生成随机值并插入它们,但无需验证数字是否重复。
我已经尝试过这样做:
INSERT into table (row1,row2)
WITH RECURSIVE
cte AS ( SELECT 0 num, LPAD(FLOOR(RAND() * 99999999),8,0) random_num
UNION ALL
SELECT num+1, LPAD(FLOOR(RAND() * 99999999),8,0) random_num
FROM cte WHERE num < 100000-1 AND random_num NOT IN (SELECT random_num FROM cte WHERE random_num IS NOT NULL))
SELECT random_num, null
FROM cte;
但条件 AND random_num NOT IN (SELECT random_num FROM cte WHERE random_num IS NOT NULL) 在 where 情况下会导致 SQL Error [4008] [HY000]: Restrictions imposed on recursive definitions are violated for table 'cte'
有什么建议吗?谢谢!
【问题讨论】:
-
使用上述 r-cte 中的逻辑,但 (a) 选择多于 100000 行 (b) 选择与 rcte
SELECT distinct random_num, null FROM cte不同的行。顺便说一句,你不需要 rcte;只有一张有十几行的表。 -
谢谢@SalmanA 我已经找到了这个解决方案,但我想知道是否有比这更好的解决方案。
-
@SalmanA:为什么是dozen?
-
并不是要分裂头发......但如果你坚持它们是独一无二的,那么你正在使用一个相当具体的随机定义。您是否考虑过使用
RAND()作为种子生成某种自定义伪随机数? (比如反复重新散列或XOR?)
标签: mysql recursion multiple-value unique-values