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` );

我的问题是如何确保所有随机字符串都是不同的,或者如何在一次滑动时实现这种升级和随机字符串的生成(最好只使用 sql)。

(在这个类似的 SO 主题中接受的答案并没有真正提供解决方案。)

[编辑:到目前为止,该表还没有任何用户昵称。正在开发的更新将为用户添加一次设置其用户昵称的功能,但在用户这样做之前,我希望为他们分配一个临时的、唯一的和随机的用户昵称 - 出于安全原因,我不想使用主 ID在那个用户昵称]

[编辑:我尝试了用户 id 的建议散列,发现它执行的散列有 8 个符号而没有重复(而 6 仍然经常有重复,对于 20k 行),但我仍然想知道是否没有其他方法可以接近这个比通过推动重复的几率更小。

否则这有效:

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 回答