我想用一个新的users字段扩展一个mysql数据库unique,该字段在创建时会被一个随机值填充。
现在我有以下命令,它们创建字段、添加随机字符串和添加unique键,但显然在执行最后一个命令时,有一些字段具有相同的随机字符串,在尝试添加键时抛出一个错误。
(我有大约20k行,所以使用“100 k随机数字符串”,仍然存在复制的可能性-但是即使字符串较长,也总是有机会的,那么如何处理可能重复的基本问题呢?)
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` );发布于 2012-12-05 12:15:01
在添加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-04 09:28:13
MySQL有一个UUID()函数,它给出了一个普遍唯一的数字。
https://stackoverflow.com/questions/13699568
复制相似问题