我想通过干净的mySQL生成一个唯一的随机整数(从10000到99999)身份; 有任何想法吗?
我不想通过循环生成这个数字(生成数字 - >在数据库中检查它)因为我想在mySQL查询中使用一些智能解决方案.
unc*_*ton 20
虽然看起来有点尴尬,但这是实现目标所能做的:
SELECT FLOOR(10000 + RAND() * 89999) AS random_number
FROM table
WHERE random_number NOT IN (SELECT unique_id FROM table)
LIMIT 1
Run Code Online (Sandbox Code Playgroud)
简单地说,它生成N个随机数,其中N是表行的计数,过滤掉表中已存在的那些,并将剩余的设置限制为1.
在大型桌子上可能会有点慢.为了加快速度,您可以从这些唯一ID创建视图,并使用它而不是嵌套的select语句.
编辑:删除引号
构建一个从序列号到1到1M范围内的随机id值的查找表:
create table seed ( i int not null auto_increment primary key );
insert into seed values (NULL),(NULL),(NULL),(NULL),(NULL),
(NULL),(NULL),(NULL),(NULL),(NULL);
insert into seed select NULL from seed s1, seed s2, seed s3, seed s4, seed s5, seed s6;
delete from seed where i < 100000;
create table idmap ( n int not null auto_increment primary key, id int not null );
insert into idmap select NULL, i from seed order by rand();
drop table seed;
select * from idmap limit 10;
+----+--------+
| n | id |
+----+--------+
| 1 | 678744 |
| 2 | 338234 |
| 3 | 469412 |
| 4 | 825481 |
| 5 | 769641 |
| 6 | 680909 |
| 7 | 470672 |
| 8 | 574313 |
| 9 | 483113 |
| 10 | 824655 |
+----+--------+
10 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
(这在我的笔记本电脑上运行大约需要30秒.你只需要为每个序列执行一次.)
现在您有了映射,只需跟踪已使用的数量(另一个表中的计数器或auto_increment键字段).
Joh*_*ker -3
我担心你为什么要这样做,但你可以简单地使用:
SELECT FLOOR(RAND() * 1000000);
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参阅完整的MySQL RAND 文档。
但是,我希望您不要将其用作唯一标识符(如果这是您所追求的,请在适当大的无符号整数字段上使用auto_increment 属性),我想知道为什么您会为此使用 MySQL 而不是一种脚本语言。你想达到什么目的?