You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MySQL中生成1-49的6个无重复随机数并插入列?

生成1-49不重复随机数的高效MySQL存储过程方案

你的问题很典型——直接多次调用RAND()生成每个数,完全没做去重校验,所以插入的记录里经常会出现重复值。下面我给你两种靠谱的解决方案,既能保证生成6个不重复的1-49随机数,又能高效完成批量插入。

方案一:用临时表批量生成(高效适合大量数据)

这种方法借助临时表和INSERT IGNORE自动过滤重复值,凑够6个唯一数后再插入目标表,批量生成时效率更高。

DELIMITER //
CREATE PROCEDURE GenerateUniqueLotteryTickets(IN howMany INT)
BEGIN
    DECLARE count1 INT DEFAULT 0;
    
    WHILE count1 < howMany DO
        -- 创建临时表存储不重复随机数,UNIQUE约束确保无重复
        DROP TEMPORARY TABLE IF EXISTS temp_numbers;
        CREATE TEMPORARY TABLE temp_numbers (num INT UNIQUE);
        
        -- 循环插入直到凑够6个不重复的数,INSERT IGNORE会跳过重复值
        WHILE (SELECT COUNT(*) FROM temp_numbers) < 6 DO
            INSERT IGNORE INTO temp_numbers VALUES (FLOOR(RAND() * 49) + 1);
        END WHILE;
        
        -- 从临时表中取出一组唯一排列插入到kupony表
        INSERT INTO kupony 
        SELECT NULL, 1, n1.num, n2.num, n3.num, n4.num, n5.num, n6.num, -1, '2018-01-01', -1
        FROM temp_numbers n1
        CROSS JOIN temp_numbers n2
        CROSS JOIN temp_numbers n3
        CROSS JOIN temp_numbers n4
        CROSS JOIN temp_numbers n5
        CROSS JOIN temp_numbers n6
        WHERE n1.num NOT IN (n2.num, n3.num, n4.num, n5.num, n6.num)
          AND n2.num NOT IN (n3.num, n4.num, n5.num, n6.num)
          AND n3.num NOT IN (n4.num, n5.num, n6.num)
          AND n4.num NOT IN (n5.num, n6.num)
          AND n5.num != n6.num
        LIMIT 1;
        
        SET count1 = count1 + 1;
    END WHILE;
END //
DELIMITER ;

方案二:逐个生成并校验(逻辑直观易理解)

如果需要更清晰的逻辑,也可以逐个生成每个数,用循环校验确保和之前的数都不重复,虽然效率略低,但对于6个数的场景完全够用。

DELIMITER //
CREATE PROCEDURE GenerateUniqueLotteryTickets(IN howMany INT)
BEGIN
    DECLARE count1 INT DEFAULT 0;
    DECLARE liczba1, liczba2, liczba3, liczba4, liczba5, liczba6 INT;
    
    WHILE count1 < howMany DO
        -- 生成第一个随机数
        SET liczba1 = FLOOR(RAND() * 49) + 1;
        
        -- 生成第二个数,直到和第一个不重复
        REPEAT
            SET liczba2 = FLOOR(RAND() * 49) + 1;
        UNTIL liczba2 != liczba1 END REPEAT;
        
        -- 生成第三个数,和前两个都不重复
        REPEAT
            SET liczba3 = FLOOR(RAND() * 49) + 1;
        UNTIL liczba3 NOT IN (liczba1, liczba2) END REPEAT;
        
        -- 生成第四个数
        REPEAT
            SET liczba4 = FLOOR(RAND() * 49) + 1;
        UNTIL liczba4 NOT IN (liczba1, liczba2, liczba3) END REPEAT;
        
        -- 生成第五个数
        REPEAT
            SET liczba5 = FLOOR(RAND() * 49) + 1;
        UNTIL liczba5 NOT IN (liczba1, liczba2, liczba3, liczba4) END REPEAT;
        
        -- 生成第六个数
        REPEAT
            SET liczba6 = FLOOR(RAND() * 49) + 1;
        UNTIL liczba6 NOT IN (liczba1, liczba2, liczba3, liczba4, liczba5) END REPEAT;
        
        -- 插入到目标表
        INSERT INTO kupony VALUES(NULL, 1, liczba1, liczba2, liczba3, liczba4, liczba5, liczba6, -1, '2018-01-01', -1);
        
        SET count1 = count1 + 1;
    END WHILE;
END //
DELIMITER ;

小优化提示

原代码里的FLOOR(RAND()*(49-1)+1)可以简化成FLOOR(RAND()*49)+1,两者效果完全一致,写法更简洁。

内容的提问来源于stack exchange,提问作者gushy22

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:02:01