実現したいこと
MySQLでランダムな値をカラムに入れたいです。
前提
必須の条件
・ランダムな6文字
・文字種は「アルファベット大文字、小文字、0-9の数字」の3つ
もしできればな条件
・重複させたくない
発生している問題・エラーメッセージ
エラーはありません。しかしざっと見てみるお、なんとなくランダムにならないような印象があります。
該当のソースコード
以下です。実行すると、ランダムというか、似通った値になってしまいます。(012345
などという値も入り、ランダム性が疑わしいです。)
SQL
1update tbl set rand_str = 2SUBSTRING('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', FLOOR(RAND() * 62) + 1, 6);
試したこと
以下試すと上記よりはランダムっぽくなりましたが、どうにも冗長な印象があり改善したいです。
SQL
1update tbl set rand_str = 2CONCAT( 3SUBSTRING('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', FLOOR(RAND() * 62) + 1, 1), 4SUBSTRING('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', FLOOR(RAND() * 62) + 1, 1), 5SUBSTRING('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', FLOOR(RAND() * 62) + 1, 1), 6SUBSTRING('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', FLOOR(RAND() * 62) + 1, 1), 7SUBSTRING('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', FLOOR(RAND() * 62) + 1, 1), 8SUBSTRING('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', FLOOR(RAND() * 62) + 1, 1) 9)
確認したこと
上述のように、できれば「重複させたくない」と思っております。
まぁこの条件は達成できなくとも、UPDATE後に重複をSELECTし、重複レコードに対し再度UPDATEすればいいと思っておりましたので、いったん「試したこと」の実行後に、以下で重複をSELECTしてみました。
SQL
1SELECT rand_str, COUNT(*) FROM tbl GROUP BY rand_str HAVING COUNT(*) > 1;
すると全レコード約6万件に対し、570件の重複がSELECTされ驚きました。
といいますのは、「アルファベット大文字、小文字、0-9の数字」では 56,800,235,584 通りになるはずなのに、6万件のうち570件も重複する可能性は低いはず。一体なぜ…?という驚きです。
このことから、「試したこと」ではランダム性がやや低いのか、とも疑っております。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答2件
あなたの回答
tips
プレビュー