【发布时间】:2019-08-01 19:12:11
【问题描述】:
我正在做项目。有人在瓶盖下发送代码。我想为它生成 100 万个唯一代码。前 3 个索引应该是大写字母,最后 2 个应该是数字。其实我想要所有的值是 26*26*26*10*10
我尝试了下面的代码,但它给了我非唯一的值。我数的时候看到了。
DELIMITER $$
CREATE PROCEDURE randomizer()
BEGIN
DECLARE i INT DEFAULT 0 ;
DECLARE random CHAR(20) ;
myloop: loop
SET random=CONCAT(
CHAR(round(rand()*25)+65),
CHAR(round(rand()*25)+65),
CHAR(round(rand()*25)+65),
(round(rand()*25)+65)
);
INSERT INTO `passwords` (`pass`) VALUES (i+1,random) ;
SET i=i+1;
IF i=1757600 THEN
LEAVE myloop;
END IF;
END LOOP myloop;
END $$
DELIMITER;
我试图使列唯一键,但它显示错误是1136 - Column count doesn't match value count at row 1。在我的代码中,它会生成代码,但它们都不是唯一的。
【问题讨论】:
-
我觉得交叉连接在这里会更有效率,而且您可以生成所有 1757600 个组合而不会重复。
-
我怎么怀疑 CROSS JOIN 在这里会有所帮助 RAND() 不是(真的)独一无二的? @JNevill .. 很明显
RAND()不是很适合我会看看UUID()哪些接缝更适合这里? -
针对包含不同字母和数字的表的交叉连接将允许我们完全避免
RAND()。事实上,我不认为 OP 真的想要随机化,而是 AlphaAlphaAlphaDigitDigit 的所有可能组合。RAND()只是他们的尝试,但除非他们检查每个随机生成的 AAADD 组合与之前的组合,否则重复将很快浮出水面,到达终点将需要很长时间。交叉连接不会很快,但它会产生所有可能的组合。
标签: mysql database stored-procedures unique