【问题标题】:Generating all possible unique and random values given conditions in MySQL在 MySQL 中给定条件生成所有可能的唯一值和随机值
【发布时间】: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


【解决方案1】:

我在评论中提到,交叉连接/笛卡尔积将是一种更有效的方法。我认为类似以下的方法可以解决问题:

CREATE TABLE alpha (bet char(1));
CREATE TABLE numbers (num tinyint);
INSERT INTO alpha VALUES 
('A'),
('B'),
('C'),
('D'),
('E'),
('F'),
('G'),
('H'),
('I'),
('J'),
('K'),
('L'),
('M'),
('N'),
('O'),
('P'),
('Q'),
('R'),
('S'),
('T'),
('U'),
('V'),
('W'),
('X'),
('Y'),
('Z');


INSERT INTO numbers VALUES
(0),
(1),
(2),
(3),
(4),
(5),
(6),
(7),
(8),
(9);

SELECT CONCAT(t1.bet,t2.bet,t3.bet,t4.num,t5.num)
FROM alpha t1, alpha t2, alpha t3, numbers t4, numbers t5;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多