我正在做一个游戏,在某个时候涉及车辆.我有一个名为"vehicles"的MySQL表,其中包含有关车辆的数据,包括存储车辆牌照的"plate"列.

现在是我遇到问题的部分.我需要找到一个未使用的车牌,然后再创建一个新的车辆-它应该是一个字母数字8字符随机字符串.我是如何做到这一点的,是在Lua中使用while循环来生成字符串,并查询数据库以查看是否使用了它.Lua是我正在编程的语言.然而,随着车辆数量的增加,我预计这将变得比现在更加低效.因此,我决定try 使用MySQL查询来解决这个问题.

我需要的查询应该只是生成一个8个字符的字母数字字符串,该字符串不在表中.我想到了generate&再次判断循环方法,但我不会把这个问题限制在这个范围内,以防有更有效的方法.我已经能够通过定义一个包含所有允许的字符的字符串并随机对其进行子串来生成字符串,仅此而已.

感谢您的帮助.

推荐答案

这个问题由两个截然不同的子问题组成:

  • 字符串必须看起来是随机的
  • 字符串必须是唯一的

虽然随机性很容易实现,但没有重试循环的唯一性却不容易实现.这让我们首先要关注独特性.非随机唯一性可以用AUTO_INCREMENT实现.因此,使用保持唯一性的伪随机变换就可以了:

  • Hash是由@paul建议的
  • AES也适用
  • 但有一个很好的例子:RAND(N)本身!

由同一种子创建的随机数序列保证

  • 可复制
  • 在前8次迭代中有所不同
  • 如果种子是INT32

所以我们使用了@AndreyVolk或@GordonLinoff的方法,但使用了seeded RAND:

e、 g.Assumin id是一个AUTO_INCREMENT列:

INSERT INTO vehicles VALUES (blah); -- leaving out the number plate
SELECT @lid:=LAST_INSERT_ID();
UPDATE vehicles SET numberplate=concat(
  substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@lid)*4294967296))*36+1, 1),
  substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
  substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
  substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
  substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
  substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
  substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
  substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed)*36+1, 1)
)
WHERE id=@lid;

Mysql相关问答推荐

MYSQL子查询

如何在JOIN中获取MySQL中的项目总数

版本升级到5.0.0后在QueryDSL中使用Enum时出错

MySQL滑动窗口动态间隔?

使用字符串文字与使用日期文字时的SQL行为

mysql 获取每个单词的第一个字母

警告:MYSQL_OPT_RECONNECT 已弃用

Mysql如何分行分词

try 在 .map 中使用 Favorite 选项卡进行react .我无法更改 mysql 表上的布尔类型

SQL使用LIMIT获取结果和结果中的行数

为什么这个查询需要超过 5 秒才能运行?

使用 DISTINCT 时无法从数据库中查询所有数据

在 where 子句中左连接多个值

如何在任何连续范围内获得最大值

Golang Gorm 没有创建带有约束的表

mysql - 如何加入表中的动态列

你如何 OR 两个 LIKE 语句?

如何将时刻 JS 时间插入 MySQL

在 MySQL 中找不到 outfile 创建的文件

MySQL查询/子句执行顺序