0

重複を防ぐために一意のコードを生成しようとすると、HAVING句を使用して次のクエリを使用するため、エイリアスを使用できますが、重複キーエラーが発生します。

SELECT
  FLOOR(100 + RAND() * 899) AS random_code 
FROM product_codes 
HAVING random_code NOT IN (values) 
LIMIT 1

次のコードは機能せず、必要なものです。

https://stackoverflow.com/a/4382586

これを達成するためのより良い方法はありますか、それとも私のクエリに何か問題がありますか?

4

2 に答える 2

2

一意であることが保証されている一意のコードが必要な場合は、mySQL関数を使用してくださいUUID()

http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_uuid

「UUIDは、空間と時間でグローバルに一意の数値として設計されています。UUID()を2回呼び出すと、相互に接続されていない2台の別々のコンピューターでこれらの呼び出しが実行された場合でも、2つの異なる値が生成されると予想されます。」

UUIDが長すぎる場合(たとえば、正確に特定の桁数である必要がある場合)、UUIDをハッシュし(たとえば、md5またはsha-256を使用)、特定のビット数を取得して、それを10進整数に変換します。一意性を保証するのはUUID全体であり、その一部ではないため、ハッシュは重要です。ただし、これでハッシュ衝突を取得できるようになります。これは、sqrt(2 ^ bits)を超えるエントリがあるとすぐに発生する可能性があります。たとえば、0-1023に10ビットを使用する場合、約32エントリ後に、ハッシュの衝突が発生する可能性があります。この数ビットを使用する場合は、代わりにインクリメントシーケンスを検討してください。

于 2013-01-24T02:06:44.097 に答える
0

MYSQL クエリを使用して 0 から 999 までの乱数をコードとして取得したかったのですが、そのクエリを試してみましたが、0 から 999 までの値の条件の入力を終了しても、常に重複したコード、奇妙な動作が発生したため、PHP を使用することになりました。

私が今使用している手順:

0 から 999 が入力された配列を作成します。将来、さらにコードが必要になった場合は 0 から 9999 を使用します。

$ary_1 = 配列(0, 1, 2, ...., 999)

テーブル内のすべてのコードを入力した別の配列を作成します。

$ary_2 = 配列(4, 5, 985, 963, 589)

array_diff を使用して結果の配列を取得します。

$ary_3 = array_diff($ary_1, $ary_2)

結果のarray_diffからarray_randを使用して配列キーを取得します。

$new_code_key = array_rand($ary_3, 1)

そのキーを使用してコードを取得し、MYSQL クエリを作成します。

$ary_3[$new_code_key]

そのキーを新しいコード配列から設定解除して、プロセスを高速化し、別の array_rand キーを取得して後で設定解除するだけです。

unset($ary_3[$new_code_key])

于 2013-01-24T08:24:21.850 に答える