首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >添加具有随机值和唯一键、重复条目的字段

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

Stack Overflow用户
提问于 2012-12-04 09:22:01
回答 2查看 2.3K关注 0票数 0

我想用一个新的users字段扩展一个mysql数据库unique,该字段在创建时会被一个随机值填充。

现在我有以下命令,它们创建字段、添加随机字符串和添加unique键,但显然在执行最后一个命令时,有一些字段具有相同的随机字符串,在尝试添加键时抛出一个错误。

(我有大约20k行,所以使用“100 k随机数字符串”,仍然存在复制的可能性-但是即使字符串较长,也总是有机会的,那么如何处理可能重复的基本问题呢?)

代码语言:javascript
复制
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行),但是我仍然不知道是否有其他的方法来处理这个问题,只有推小复制的几率。

否则,这样做是可行的:

代码语言:javascript
复制
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` );
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-05 12:15:01

在添加unique密钥之前,似乎没有一种真正的方法来捕获或避免生成重复项的可能性。因此,增加随机字符串的复杂性似乎是最可行的解决方案,如下所示:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-12-04 09:28:13

MySQL有一个UUID()函数,它给出了一个普遍唯一的数字。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13699568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档