0

作成時にランダムな値で埋められるusers新しいフィールドでmysqlデータベースを拡張したいと思います。unique

現在、フィールドを作成し、ランダムな文字列を追加し、uniqueキーを追加するこれらのコマンドがありますが、明らかに最後のコマンドを実行すると、キーを追加しようとするとエラーをスローする等しいランダムな文字列を持つフィールドがあります。

(私は約20k行あるので、「100k乱数文字列」では重複の可能性がかなりありますが、より長い文字列でも常に可能性があるので、重複の可能性の基本的な問題をどのように処理しますか?)

ALTER TABLE `users` ADD `nick` VARCHAR( 55 ) NOT NULL AFTER `id`;

UPDATE `users` SET `nick` = CONCAT('user_', FLOOR(RAND() * 100000));

ALTER TABLE `users` ADD UNIQUE ( `nick` );

私の質問は、すべてのランダム文字列が明確であることを確認する方法、または1回のスワイプでこのアップグレードとランダム文字列の生成を実現する方法(できればSQLのみ)です。

(この同様のSOトピックで受け入れられた回答は、実際には解決策を提供しません。)

[編集:これまでのところ、テーブルにはユーザーのニックネームはありません。開発中のアップデートでは、ユーザーがユーザーのニックネームを一度設定する機能が追加されますが、ユーザーが設定するまで、一時的で一意のランダムなユーザーのニックネームをユーザーに割り当ててもらいたいです。セキュリティ上の理由から、プライマリIDは使用しません。そのユーザーのニックネームで]

[編集:ユーザーIDの提案されたハッシュを試してみたところ、ハッシュの8つの兆候があると、重複なしで実行されることがわかりました(6はまだかなり頻繁に重複しており、2万行の場合)が、他に方法がないかどうか疑問に思います複製のオッズを小さくするよりも、これにアプローチします。

それ以外の場合、これは機能します:

ALTER TABLE `users` ADD `nick` VARCHAR( 55 ) NOT NULL AFTER `id`;

UPDATE `users` SET `nick` = CONCAT('user_', SUBSTR(MD5(`users`.`id`), 1, 8));

ALTER TABLE `users` ADD UNIQUE ( `nick` );
4

2 に答える 2

2

MySQLにはUUID()、普遍的に一意の番号を与える機能があります。

于 2012-12-04T09:28:13.047 に答える
0

uniqueキーを追加する前に、生成された重複の可能性をキャッチまたは回避する実際の方法はないようです。したがって、ランダムな文字列の複雑さを増すことは、次のように最も実行可能な解決策のようです。

ALTER TABLE `users` ADD `nick` VARCHAR( 55 ) NOT NULL AFTER `id`;

UPDATE `users` SET `nick` = CONCAT('user_', SUBSTR(MD5(`users`.`id`), 1, 8));

ALTER TABLE `users` ADD UNIQUE ( `nick` );

編集:追加されたランダムな文字列の複雑さを増す以外に新しい提案がない限り、これを正解としてマークします。

于 2012-12-05T12:15:01.633 に答える