2

当我插入记录时,MySQL 数据库是否可以生成仅由数字和字母组成的 5 或 6 位代码?如果有怎么办?

就像 goo.gl、bit.ly 和 jsfiddle 一样。例如:

cZ6ahF、3t5mM、xGNPN、xswUdS...

所以UUID_SHORT()不起作用,因为它返回一个像23043966240817183

要求:

  1. 必须是唯一的(不重复)
  2. 可以但不要求基于主键整数值
  3. 必须缩放(在使用了所有可能的组合后增加一个字符)
  4. 必须看起来很随意。(项目1234不能是BCDE,而项目1235BCDF
  5. 必须在插入时生成。

非常感谢代码示例。

4

2 回答 2

2

尝试这个:

SELECT LEFT(UUID(), 6);
于 2013-07-11T15:16:02.977 回答
1

实际上,我建议使用 Redis 来完成这项任务。它具有使此任务适合其使用的所有功能。最重要的是,它非常擅长在大列表中搜索值。

我们将创建两个列表buffered_ids, 和used_ids。cronjob 将每 5 分钟运行一次(或任何您喜欢的时间间隔),它将检查长度buffered_ids并将其保持在 5000 以上。当您需要使用 id 时,将其从 中弹出buffered_ids并添加到used_ids.

Redis has sets,它们是集合中的唯一项。将其视为一个哈希,其中键是唯一的,所有值都是“真”。

你的 cronjob,在 bash 中:

log(){ local x=$1 n=2 l=-1;if [ "$2" != "" ];then n=$x;x=$2;fi;while((x));do let l+=1 x/=n;done;echo $l; }
scale=`redis-cli SCARD used_ids`
scale=`log 16 $scale`
scale=$[ scale + 6]
while [ `redis-cli SCARD buffered_ids` -lt 5000 ]; do
    uuid=`cat /dev/urandom | tr -cd "[:alnum:]" | head -c ${1:-$scale}`
    if [ `redis-cli SISMEMBER used_ids $uuid` == 1]; then
        continue
    fi
    redis-cli SADD buffered_ids $uuid
done

获取下一个 uid 以在您的应用程序中使用(在伪代码中,因为您没有指定语言)

$uid = redis('SPOP buffered_ids');
redis('SADD used_ids ' . $uid);

编辑实际上那里有一个竞争条件。要安全地弹出一个值,请先将其添加到 used_ids,然后将其从 buffered_ids 中删除。

$uid = redis('SRANDMEMBER buffered_ids');
redis('SADD used_ids ' . $uid);
redis('SREM buffered_ids ' . $uid);
于 2013-07-11T15:34:37.153 回答