添加具有随机值和唯一键,重复条目的字段

时间:2012-12-04 09:22:02

标签: mysql distinct alter unique-key

我想扩展一个mysql数据库users,其中包含一个新的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)。

this similar SO topic中接受的答案并没有真正提供解决方案。)

[编辑:到目前为止,该表还没有任何用户昵称。正在开发的更新将为用户添加一次设置用户昵称的功能,但在用户这样做之前,我希望为他们分配一个临时的,唯一的和随机的用户昵称 - 出于安全考虑,我不想使用主要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` );

2 个答案:

答案 0 :(得分:2)

MySQL有一个UUID()函数,它提供了一个通用唯一的数字。

答案 1 :(得分: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` );

编辑:我将此标记为正确答案,只要除了增加随机字符串的复杂性之外没有新的建议。