我想扩展一个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` );
答案 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` );
编辑:我将此标记为正确答案,只要除了增加随机字符串的复杂性之外没有新的建议。