あなたのコメントに基づいて、以下のアプローチがうまくいくかもしれません。特定の質問に実際に答えるわけではありませんが、おそらく要件を満たしています。
私はあなたの要件が変わることはないと仮定します (例えば、ユーザーに 6 つの ID の選択肢を提示するなど)。率直に言って、これは少し変わった要件だと思いますが、興味深い SQL になります。:-)
これが私のアプローチです: 10 個の乱数を生成します。データベースに既に存在するものを除外します。これらの乱数のうち 6 つをユーザーに提示します。ランダムな ID 番号は、連続した ID 番号と比較して、トランザクション性に関して非常に優れた特性を持っているため、アプリが普及した場合、これは非常にうまくスケーリングするはずです。
SELECT
temp.i
FROM
(
SELECT 18 AS i -- 10 random
UNION SELECT 42 -- numbers.
UNION SELECT 88
UNION SELECT 191 -- Let's assume
UNION SELECT 192 -- you generated
UNION SELECT 193 -- these in the
UNION SELECT 1000 -- application
UNION SELECT 123456 -- layer.
UNION SELECT 1092930
UNION SELECT 9892919
) temp
LEFT JOIN
mytable ON (temp.i = mytable.i)
WHERE
mytable.i IS NULL -- filter out collisions
LIMIT
6 -- limit results to 6
SQLポップクイズタイム!!!
WHERE mytable.i IS NULL
行 " " が衝突をフィルタリングするのはなぜですか? (ヒント: 主キーの場合、どのmytable.i
ように null になることができますか?)
ここにいくつかのテストデータがあります:
CREATE TABLE mytable (i BIGINT PRIMARY KEY) ;
INSERT INTO mytable VALUES (88), (3), (192), (123456) ;
上記のクエリを実行すると、結果が次のようになります。88、192、および 123456 はフィルターで除外されていることに注意してください。これらはテスト データに対する衝突になるためです。
+---------+
| i |
+---------+
| 18 |
| 42 |
| 191 |
| 193 |
| 1000 |
| 1092930 |
+---------+
そして、それらの乱数を生成する方法は? おそらく rand() * 9223372036854775807 が機能します。(負の数が必要ないと仮定して!)