怎么为我的 MySql 表列之一生成唯一的随机字符串?

本教程将介绍如何为我的 MySql 表列之一生成唯一的随机字符串?的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

怎么为我的 MySql 表列之一生成唯一的随机字符串? 教程 第1张

问题描述

我使用的是 MySql 5.5.37.我有一个包含以下列的表格

+------------------+------------------+------+-----+---------+-------+
| Field| Type | Null | Key | Default | Extra |
+------------------+------------------+------+-----+---------+-------+
| ID| varchar(32)| NO| PRI | NULL | |
| CODE | varchar(6) | NO| UNI | NULL | |

代码列是唯一的,我的 ID 列是 GUID.根据上表中的某些条件(例如 WHERE COLUMN1 = 0),我有许多行要更新.怎么为我的 CODE 列生成随机的、唯一的 6 字符代码(最好是字母和数字),这样它们就不会违反我的表中的唯一约束?请注意,表中不符合条件的列(例如 Where COLUMN1 <> 0)已经具有 CODE 列的唯一值.

这与这个问题不同——Generating a random &使用 MySQL 的唯一 8 字符串,因为该链接处理的 ID 是数字.我的 ID 是 32 个字符的字符串.此外,他们的解决方案没有考虑到在运行我要运行的语句之前表中可能存在值,这将为相关列生成唯一值.

推荐答案

BEFORE UPDATE 触发器解决方案:

您可以使用以下命令创建 6 个字符的随机字母数字大写字符串:

lpad(conv(floor(rand()*pow(36,6)), 10, 36), 6, 0);

为了不创建已经存在的字符串,您可以使用 BEFORE UPDATE 触发器.

DELIMITER //
CREATE TRIGGER `unique_codes_before_update`
BEFORE UPDATE ON `unique_codes` FOR EACH ROW 
BEGIN
 declare ready int default 0;
 declare rnd_str text;
 if new.CODE is null then
  while not ready do
set rnd_str := lpad(conv(floor(rand()*pow(36,6)), 10, 36), 6, 0);
if not exists (select * from unique_codes where CODE = rnd_str) then
 set new.CODE = rnd_str;
 set ready := 1;
end if;
  end while;
 end if;
END//
DELIMITER ;

每次在 UPDATE 语句中将 CODE 列设置为 NULL 时,触发器都会在循环中创建一个新的随机字符串,直到在表中找不到匹配项.

现在您可以将所有 NULL 值替换为:

update unique_codes set CODE = NULL where code is NULL;

在 这里的 SQLFiddle 演示中,我使用一个字符的随机字符串来证明没有值重复.

您还可以在 BEFORE INSERT 触发器中使用相同的代码.这样,您只需使用 CODE=NULL 插入新行,触发器会将其设置为新的唯一随机字符串.而且您永远不需要再次更新它.

原答案(32个字符串):

select lpad(conv(floor(rand()*pow(36,8)), 10, 36), 8, 0) as rnd_str_8;

-- output example: 3AHX44TF

将生成一个 8 字符的字母数字大写随机字符串.将其中四个连接起来得到 32 个字符:

select concat(
 lpad(conv(floor(rand()*pow(36,8)), 10, 36), 8, 0),
 lpad(conv(floor(rand()*pow(36,8)), 10, 36), 8, 0),
 lpad(conv(floor(rand()*pow(36,8)), 10, 36), 8, 0),
 lpad(conv(floor(rand()*pow(36,8)), 10, 36), 8, 0)
) as rnd_str_32;

-- output example: KGC8A8EGKE7E4MGD4M09U9YWXVF6VDDS

那么唯一性呢?好吧 - 尝试生成重复 😉

好了关于怎么为我的 MySql 表列之一生成唯一的随机字符串?的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。