mysql唯一编号生成

hip*_*out 15 mysql sql random

我想通过干净的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语句.

编辑:删除引号

  • @unclenorton 我不断收到`> 1054 - 'where 子句'中的未知列'random_number`'。 (3认同)

Mar*_*tin 5

构建一个从序列号到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 而不是一种脚本语言。你想达到什么目的?