gpt4 book ai didi

mysql - 如何为我的 MySql 表列之一生成唯一的随机字符串?

转载 作者:IT老高 更新时间:2023-10-28 23:58:05 27 4
gpt4 key购买 nike

我使用的是 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 字符代码(最好是字母和数字),这样它们就不会违反我的表中的唯一约束?请注意,表中不符合条件的列(例如,其中 COLUMN1 <> 0)已经具有 CODE 列的唯一值。

编辑: 这与这个问题不同——Generating a random & unique 8 character string using MySQL因为该链接处理的 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 demo here我使用单字符随机字符串来证明没有重复值。

您还可以在 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

http://sqlfiddle.com/#!9/9eecb7d/76933

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

关于mysql - 如何为我的 MySql 表列之一生成唯一的随机字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39257391/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com