mysql生成重複しない乱数(unique number generation)

2759 ワード

問題のソース
ビジネスでは、商品番号、部屋番号、その他のアイテム番号など、重複しない乱数を生成する場合があります.テーブルの自己増加インデックスidを採用したくないと同時に、新しく生成された番号が重複しないことを望んでいる.
これはmysqlの乱数機能を試す必要がある.
Solution
mysqlのrand関数は0から1の間の乱数を生成し,一定の増幅を行うと乱数を得ることができる.さらに、条件クエリーを使用して、テーブルに新しい乱数が表示されないことを制限します.次のようになります.
SELECT FLOOR(RAND() * 99999) AS random_num
FROM numbers 
WHERE "random_num" NOT IN (SELECT my_number FROM numbers)
LIMIT 1

しかし実測により,この方法は表空時に戻っても空である.表が空の場合を考慮して、次のように集合を追加します.
SELECT random_num
FROM (
  SELECT FLOOR(RAND() * 99999) AS random_num 
  FROM numbers
  UNION
  SELECT FLOOR(RAND() * 99999) AS random_num
) AS ss
WHERE "random_num" NOT IN (SELECT my_number FROM numbers)
LIMIT 1

テーブルが空の場合、unionフィールドを使用して乱数の戻りを直接取得します.
延長:mysqlランダムレコード
基本的な考え方:ランダムにソートします.
select * from numbers order by rand() limit 1

この行のコマンドでは、テーブルからランダムにレコードを選択できます.ランダムに複数を選択する方法は、次のとおりです.
select * from numbers order by rand() limit 10

order by rand()のやり方は効率が悪く、本人も記録の多い時計で測ったことがないという.規模が大きくない前提の下で、この方法を使うのが一番簡単だと思います.効率を考慮する場合は、文末のリンクを参照してください.
リンク
How to Generate Random number without repeat in database using PHP?
mysql unique number generation
MySQL select 10 random rows from 600K rows fast